分发饼干
解题代码
我的:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
if(s.size()>g.size()) s=vector<int>(s.begin()+s.size()-g.size(), s.end());
int start=0;
for(int i=0; i<s.size(); i++){
for(int j=start; j<g.size(); j++){
if(s[i]>=g[j]){
start=j+1;
break;
}
}
}
return start;
}
};
说明:
对于这个题目,我也是想到了贪心算法,但是代码是两层for循环,所以运行的效率有点低……,然后看了卡哥的题解,发现代码写得还是很润的,这点,值得多多学习。
卡哥题解:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int j = s.size() - 1;
int num = 0;
for (int i = g.size() - 1; i >= 0; i--) {
if (j >= 0 && s[j] >= g[i]) {
num++;
j--;
}
}
return num;
}
};
摆动序列
解题代码
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size()==1) return nums.size();
int count=1;
int c=0, p=0;
for(int i=0; i<nums.size()-1; i++){
c=nums[i+1]-nums[i];
if(p >=0 && c<0 || p<=0 && c>0){
count++;
p=c;
}
}
return count;
}
};
解题感悟
对于该题目,对于贪心的思路我也是没想出来……
但是,该题目的贪心要配合着代码的相关细节才能写出,而且代码的相关细节比贪心的思路更不容易想出。
相关细节:
1、对于单调有平坡:当出现摆动时,再去更新p。
2、上下坡度有平坡:在if条件中的p中的不等式中补充‘=’。
有人要问,为什么不是c中,而是p中,对于这点,看看图就知道了
3、对于首位元素:result=1(初始化),就是只对前n-1个元素判断,(这一点我实在是不知道怎么表达,反正就是大致意思啦)。
最大子序和
解题代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxSum=INT_MIN;
int sum=0;
for(int i=0; i<nums.size(); i++){
sum+=nums[i];
maxSum=sum>maxSum?sum:maxSum;
cout<<maxSum<<" ";
if(sum < 0) sum=0;
}
return maxSum;
}
};
解题感悟
贪心想不出,直接说思路吧,当前“连续和”为负数时就立即放弃,从下一个元素重新计算“连续和”,有人疑问:但是如果后面都是很多整数,不就将前面的负数“连续和”加回来了吗,但是要想,如果将“连续和”重置为0再从后面相加肯定是比负连续和加前面的正数要大一些。