贪心算法3

187 阅读2分钟

小知识,大挑战!本文正在参与“   程序员必备小知识   ”创作活动

本文同时参与 「掘力星计划」   ,赢取创作大礼包,挑战创作激励金

贪心算法

贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的.

1. 删除被覆盖区间

问题:

解法: 这个和之前的区间问题一样。首先想到的就是要排序,怎么排? 假如一个区间A被另一个区间B覆盖了,那么这个区间A的首尾一定会小于另一个B的首尾。所以我还按照起始值的大小排序,把小的放前面,这样后面的区间的第一个维度一定是满足小于了,然后判断第二个维度是否还是小于。如果B[1]也小于A[1],那么B就可以被删除。如果不满足的话,我们就要更新当前区间的首尾值。(因为首值一定是递增的,不会存在第三个值C的起止值在A的开始和B的开始之间。此外,排序的时候要注意在起始值相同的情况,末尾值要先选大的)

class Solution {
public:
    static bool compare(const vector<int>& A, const vector<int>& B)//要注意第二个维度
    {
        if(A[0]<B[0]) return true;
        else if(A[0]==B[0]) return A[1]>B[1];
        return false;

    }
    int removeCoveredIntervals(vector<vector<int>>& intervals) {

            if(intervals.size()<=1) return intervals.size();
            sort(intervals.begin(),intervals.end(),compare);
            int pre_start =intervals[0][0];
            int pre_end =intervals[0][1];
            int count=0;//被删除的数目
            for(int i=1;i<intervals.size();i++)
            {
                if(pre_end>=intervals[i][1]) //被覆盖了
                    count++;
                else
                    pre_end=intervals[i][1];
            }
            return intervals.size()-count;
    }
};

2.跳跃游戏1

问题: 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 算法:从最初位置开始,贪心的往前跳最远的长度,记录可以跳跃的最远长度,判断长度是否可以超过终点。在更新新的最远长度的时候,要判断当前的最远长度是否大于当前的坐标。如果小于的话,说明到达不了当前这个位置。

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int cur=0;
        for(int i=0;i<nums.size();i++)
        {
            if(cur<i)
                return false;
            cur =max(nums[i]+i,cur);
        }
        return cur>=nums.size()-1;

    }
};
class Solution {
public:
    bool canJump(vector<int>& nums) {
        int cur=0;
        for(int i=0;i<nums.size();i++)
        {
            if(cur<i)
                return false;
            cur =max(nums[i]+i,cur);
        }
        return cur>=nums.size()-1;

    }
};