Day3-LeetCode刷题(贪心算法练习)

今天是刷题的第三天,引用kuangbin大佬的话
人—我百,人十我万!追逐青春的梦想,怀着自信的心,永不放弃!
虽然可能做不到如此,但希望持续下去。

452. Minimum Number of Arrows to Burst Balloons(Medium)

原题地址
在这里插入图片描述

题目描述

  • 这道题的题意是说有多个气球,给定多个气球的X轴位置,需要将所有气球射下来。
  • 输入为一个二维数组,每一行为一个区间,这区间用一个含有两个元素的数组表示,输出是最少射击数。

策略

  • 这题考虑贪心算法,和昨天做的那道区间问题类似,但略有不同,昨天做是需要维护一个更大的区间,即可以将区间合并,但这题不同,理论上是找某个点,这个点被更多的区间包括,所以,需要更新区间左边端点。

代码:

class Solution {
    
    
public:
    int findMinArrowShots(vector<vector<int>>& points) {
    
    
        int size = points.size();
        if(size==0){
    
    
            return 0;
        }
        sort(points.begin(),points.end(),[](vector<int>& a, vector<int>& b){
    
    
            return a[0] < b[0];
        });
        
        int ans=1, pred = points[0][1];
        for(int i=1; i<size; ++i){
    
    
            if(points[i][0] > pred){
    
    
                ++ans;
                pred = points[i][1];
            }else{
    
    
                if(points[i][1]<=pred){
    
    
                    pred = points[i][1];
                }
            }
        }
        return ans;
    }
};

763. Partition Labels(Medium)

原题地址
在这里插入图片描述

题目描述

  • 这道题给了我们一个字符串S,然我们将其尽可能多的分割为子字符串,条件是每种字符最多只能出现在一个子串中。比如题目汇总的例子,字符串S中有多个a,这些a必须只能在第一个子串中,再比如所有的字母e值出现在了第二个子串中。那么这道题的难点就是如何找到字符串的断点,即拆分成为子串的位置。
  • 输入是字符串,输出为一个数组,其中是各个分割后子串的长度。

策略

  • 我们仔细观察题目中的例子,可以发现一旦某个字母多次出现了,那么其最后一个出现位置必须要在当前子串中。所以我们关注的是每个字母最后的出现位置,我们可以使用一个 HashMap 来建立字母和其最后出现位置之间的映射。建立好映射之后,就需要开始遍历字符串S了,我们维护一个 start 变量,是当前子串的起始位置,还有一个 last 变量,是当前子串的结束位置,每当我们遍历到一个字母,我们需要在 HashMap 中提取出其最后一个位置,因为一旦当前子串包含了一个字母,其必须包含所有的相同字母,所以我们要不停的用当前字母的最后一个位置来更新 last 变量,只有当i和 last 相同了,即当前子串包含了所有已出现过的字母的最后一个位置,即之后的字符串里不会有之前出现过的字母了,此时就应该是断开的位置,同理类推,我们可以找出之后的断开的位置。

代码:

class Solution {
    
    
public:
    vector<int> partitionLabels(string S) {
    
    
        int size = S.size(), start=0, last=0;
        vector<int> ans;
        unordered_map<char, int> map;
        for(int i=0;i<size;i++){
    
    
            map[S[i]] = i;
        }
        for(int i=0;i<size;i++){
    
    
            last = max(last, map[S[i]]);
            if(i == last){
    
    
                ans.push_back(i-start+1);
                start = i+1;
            }
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/Geek_/article/details/113541227