小知识,大挑战!本文正在参与“ 程序员必备小知识 ”创作活动
本文同时参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金
贪心算法
贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的.
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;
}
};