455.分发饼干 题目链接
思路
贪心算法:通过局部最优得到整体最优
解题方法
先对两个数组排序,用大的饼干满足胃口大的小孩,尽量不浪费饼干.
先遍历胃口, 再遍历饼干。
若先遍历饼干,饼干在for循环会一直做减减操作,导致饼干一直不满足胃口。
另外在for循环里,遍历饼干时,要用if,如果用while,若满足条件,则会一直循环
Code
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 result=0;
for(int i=g.size()-1;i>=0;i--)
{
if(index>=0&&g[i]<=s[index])
{
result++;
index--;
}
}
return result;
}
};
复杂度
时间复杂度:
O(nlogn)
空间复杂度:
O(1)
376. 摆动序列 题目链接
思路
三种情况:
1.上下坡有平坡
2.首尾两个元素
3.单调坡有平坡
解题方法
1.设定标准:保留最右边的峰值
2.假设最前面有一个和第一个元素相等的元素,假设有一个平坡。
3.在for循环里,只记录prediff的峰值方向是否改变,不纠结值的大小是否改变。所以将“prediff=curdiff”放在for循环里
Code
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size()<=1)return nums.size();
int prediff=0;
int curdiff=0;
int result=1;
for(int i=0;i<nums.size()-1;i++)
{
curdiff=nums[i+1]-nums[i];
if((prediff<=0&&curdiff>0)||(prediff>=0&&curdiff<0))
{
result++;
prediff=curdiff;
}
}
return result;
}
};
复杂度
时间复杂度:
O(n^2)
空间复杂度:
O(n)
53. 最大子序和 题目链接
思路
局部最优:当连续和为正数时,会增大nums[i];当连续和为负数时,会减小nums[i];所以一旦连续和为负数时,就把nums[i]作为起始位置。同时把count更新为0.
解题方法
把result初始值设为最小值,for循环,让count累加,如果count>result,就更新result值,如果count小于0,就把nums[i]做为起始位置
Code
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result=INT_MIN;
int count=0;
for(int i=0;i<nums.size();i++)
{
count+=nums[i];
if(count>result)result=count;
if(count<0)count=0;
}
return result;
}
};
复杂度
时间复杂度:
O(n)
空间复杂度:
O(n)