0
点赞
收藏
分享

微信扫一扫

【数据结构】二分查找

西街小学的王 01-24 12:00 阅读 11

一、贪心算法

贪心没有套路,只有碰运气(bushi),举反例看看是否可行,(运气好)刚好贪心策略的局部最优就是全局最优。

1、分发饼干 455

思路:按照孩子的胃口从小到大的顺序依次满足每个孩子,对于每个孩子,应该选择可以满足这个孩子的胃口且尺寸最小的饼干

class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int d1 = 0, d2 = 0;
int cnt = 0;
while(d2 < s.size() && d1 < g.size()){
if(g[d1] <= s[d2++]){
++cnt;
++d1;
}
}
return cnt;
}
};

2、摆动序列 376

贪心:删除单调坡度上的节点,这个坡度就可以有两个局部峰值。所以求长度的问题变成求峰值个数。

class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int cur = 0, pre = 0;
int ans = 1;
for(int i=0; i<nums.size()-1; ++i){
cur = nums[i+1] - nums[i]; // 当前的差值
// 差值正负出现变化-->峰值出现
if((cur > 0 & 0) || (cur < 0 & 0)){
++ans;
pre = cur; // 只在摆动的时候更新
}
}
return ans;
}
};

3、最大子序和 53

思路:负的子序和只会拉低最大子序和

class Solution {
public:
int maxSubArray(vector<int>& nums) {
int ans = INT_MIN, s = 0;
for(int i=0; i<nums.size(); ++i){
s += nums[i];
if(s > ans)
ans = s;
if(s < 0)
s = 0;
}
return ans;

}
};

二、写在后面

贪心得多练。今天的摆动序列一开始没想出来。

举报

相关推荐

0 条评论