贪心算法基础
没套路
把大的饼干分给胃口最大的
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int index = s.size() - 1;
int reslut = 0;
for(int i = g.size() - 1;i >=0;i--) {
if(index >= 0 && s[index] >= g[i]) {
reslut++;
index--;
}
}
return reslut;
}
};
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size() <= 1) return nums.size();
int perDiff =0;
int curDiff = 0;
int reslut = 1; // 这个是默认包括末尾元素
for(int i =0;i < nums.size() -1;i++) {
curDiff = nums[i + 1] - nums[i];
// 这里等于=0是为了包括 上 平.....平 下 这种 和
// 数组首元素 这里是 认为首元素前面有个跟其一样的元素 这样perDiff = 0 起始初始化的时候就是
if(perDiff >= 0 && curDiff < 0 || perDiff <= 0 && curDiff > 0) {
reslut++;
perDiff = curDiff; // 加在这里是因为可以去掉 单调里平坡这种情况
}
}
return reslut;
}
};
暴力解法会超时,代码如下
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int max = nums[0];
for(int i = 0;i < nums.size();i++) {
int sum =0;
for(int j = i;j < nums.size();j++) {
sum += nums[j];
if(sum > max) max = sum;
}
}
return max;
}
};
贪心算法的思路是,如果当前的和为负数的,就舍去这个和然后重新进行sum累加,同时用reslut记录局部最优,就是每次累加判断sum > max 如果大于就更新max
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int max = nums[0];
int sum = 0;
for(int i = 0;i < nums.size();i++) {
sum += nums[i];
if(sum > max) max = sum;
if(sum < 0) sum = 0;
}
return max;
}
};