day-33 代码随想录算法训练营(19) 贪心part03

1005.K次取反后最大化的数组和

思路一:求出正负数的个数,根据k值来进行取反

134.加油站

思路:考虑总油量和当前剩余油量,同时遍历两个数组,当前剩余油量小于0时,说明在 i 之前都无法出发。

 

135.分发糖果 

思路:考虑左右两个维度,并且在考虑第二个维度的时候,需要取上一个维度和当前维度的最大值,而不是盲目添加

 

 452.用最少数量的箭引爆气球

思路:先按照左边界进行排序,再遍历数组
  • 1.判断第 i 个位置的气球和第 i-1 个位置的气球是否重合,不重合的话需要箭+1;
  • 2.重合的话,需要更新右边界,因为下一个气球需要跟前两个气球都重合
class Solution {
public:
    int findMinArrowShots(vector>& points) {
        int n=points.size();
        if(n==0) return 0;
        int res=1;
        sort(points.begin(),points.end());
        int end=points[0][1];
        for(int i=1;ipoints[i-1][1])//不重合时,需要增加箭
                res++;
            else//重合时,需要更新重合右边界
                points[i][1]=min(points[i-1][1],points[i][1]);
        }
        return res;
    }
};

435.无重叠区间

思路:计算出重叠区间个数
  • 1.排序
  • 2.当第 i 个区间和第 i-1 个区间重叠时,个数+1,因为第 i 个区间相当于要删掉,所以更新第 i 个区间的右边界为第 i-1 个区间的右边界和第 i 个区间的右边界的较小值。

day-33 代码随想录算法训练营(19) 贪心part03_第1张图片

 为什么重叠时,当前区间的右边界要更新为较小值呢?因为我们要求最少删除的重叠区间,就是求最大的不重叠区间,排序后,当两个区间重叠时,我们要选择较早结束的那个区间留下来,因为要避免和后面的区间重叠!!!

763.划分字母区间

思路:获取每个字母的最远出现长度,然后第二次遍历数组,使用两个变量维护一个重复区间,
右边界被遍历到之前一直处于更新状态;
当右边界被遍历到时,说明区间内的字母接下来都不会出现了(因为记的是最远出现距离),此时记录边界长度,并且把下一个区间的左边界更新到 i+1;
class Solution {
public:
    vector partitionLabels(string s) {
        int hash[27]={0};
        for(int i=0;ires;
        int left=0,right=0;
        for(int i=0;i

你可能感兴趣的:(#,代码随想录算法训练营(19),算法)