首页 > 其他分享 >763. 划分字母区间(leetcode)

763. 划分字母区间(leetcode)

时间:2024-08-29 16:37:03浏览次数:8  
标签:字符 片段 遍历 763 字母 List 远距离 new leetcode

https://leetcode.cn/problems/partition-labels/description/

听说这题是字节广告一面的题
有两种做法,但是思路大致相同,主要思路是先求出所有字符的出现的最远距离,然后不断往后遍历,更新当前片段的最远距离

若是第一种做法,就是放在另一个循环中,不断更新最远距离,且维护这个end,维护完毕后end就是当前片段的结尾
第二种做法也是官方做法,即不断更新片段最远距离,且往后遍历,直到遍历的位置是最远距离时
意味着这个最远距离已经更新完毕了,被正常遍历给追上了,即这个位置是当前片段的最远距离

class Solution {
    public List<Integer> partitionLabels(String s) {
        // 思路是不断遍历,遍历到没遍历过的字符就更新当前片段的最远距离
        List<Integer> res = new ArrayList<>();
        // 计算每个字符出现的最远位置
        Map<Character,Integer> pMap = new HashMap<>();
        for(int i=0;i<s.length();i++)
            pMap.put(s.charAt(i),i);
        int i=0;
        while(i<s.length())
        {
            // 获取此时的片段end
            int end=pMap.get(s.charAt(i));
            
            for(int j=i;j<end;j++)
            {
                // 更新end
                end=Math.max(end,pMap.get(s.charAt(j)));
            }
            // 更新end完毕,此时end就是当前片段的结尾
            // 加入答案
            res.add(end-i+1);
            // 更新新的片段起点
            i=end+1;
        }
        return res;

    }
}
class Solution {
    public List<Integer> partitionLabels(String s) {
        // 思路是不断遍历,遍历到没遍历过的字符就更新当前片段的最远距离
        // 贪心的地方在于当前位置和最远距离位置相同就是片段分割点
        List<Integer> res = new ArrayList<>();
        // 计算每个字符出现的最远位置
        Map<Character,Integer> pMap = new HashMap<>();
        for(int i=0;i<s.length();i++)
            pMap.put(s.charAt(i),i);
        int idx = 0;
        int last = -1;
        for (int i = 0; i < s.length(); i++) {
            // 更新当前片段的最远距离
            idx = Math.max(idx,pMap.get(s.charAt(i)));
            if (i == idx) {
                // 当前位置是当前片段的最远距离,这里是贪心的地方,也是难点
                // 且由于取的都是尽可能短的片段,因此得到的数量是最多的,这里也是贪心
                res.add(i - last);
                last = i;
            }
        }
        return res;

    }
}

 

标签:字符,片段,遍历,763,字母,List,远距离,new,leetcode
From: https://www.cnblogs.com/lxl-233/p/18387002

相关文章

  • leetcode_128_最长连续序列解析
    题目给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入......
  • leecode_049_字母异位词分组解析
    题目给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词是由重新排列源单词的所有字母得到的一个新单词。示例1:输入:strs=["eat","tea","tan","ate","nat","bat"]输出:[["bat"],["nat","tan"],[&......
  • 435. 无重叠区间(leetcode)
    https://leetcode.cn/problems/non-overlapping-intervals/description/贪心:思路是更新重叠的区间classSolution{publicinteraseOverlapIntervals(int[][]intervals){//区间问题,首先排序,找到发生重叠的两个区间,将右边的重叠区间移除,实际对应代码的操......
  • 452. 用最少数量的箭引爆气球(leetcode)
    https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/思路是排序,方便计算气球重叠,难点是在重叠时更新右边界,更新为两个区间的最右重合点,因为这个点是最少一支箭就可以射掉两个气球的最右点,再去下个循环判断区间重合classSolution{......
  • LeetCode-Python-1539. 第 k 个缺失的正整数(二分)
    给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。请你找到这个数组里第 k 个缺失的正整数。示例1:输入:arr=[2,3,4,7,11],k=5输出:9解释:缺失的正整数包括[1,5,6,8,9,10,12,13,...]。第5个缺失的正整数为9。示例2:输入:arr=[1,2,3,4],k=2......
  • 一起学习LeetCode热题100道(61/100)
    61.分割回文串(学习)给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。示例1:输入:s=“aab”输出:[[“a”,“a”,“b”],[“aa”,“b”]]示例2:输入:s=“a”输出:[[“a”]]提示:1<=s.length<=16s仅由小写英文字母......
  • leetcode215. 数组中的第K个最大元素,小根堆/快排思想
    leetcode215.数组中的第K个最大元素给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。你必须设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:[3,2,1,5,6,4],k=2......
  • LeetCode 面试经典 150 题回顾
    目录一、数组/字符串1.合并两个有序数组 (简单)2.移除元素 (简单)3.删除有序数组中的重复项 (简单)4.删除有序数组中的重复项II(中等)5.多数元素(简单)6.轮转数组 (中等)7.买卖股票的最佳时机(简单)8.买卖股票的最佳时机II (中等)9.跳跃游戏(中等)10.跳跃游戏II(中等)11.H指......
  • LeetCode - 1 两数之和
    题目来源1.两数之和-力扣(LeetCode)题目描述给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案......
  • 单调队列--滑动窗口最大值(leetcode23)
    目录一、单调队列介绍二、题目应用1.题目描述2.解题碎碎念3.代码示例三、扩展1.与优先队列区别2.单调队列其他题目一、单调队列介绍单调队列是一种特殊的队列数据结构,它能够在常数时间内找到队列中的最值。单调队列可以用来解决一些与最值相关的问题,例如滑动窗口最......