455.分发饼干
思路
先排序,将饼干和胃口从小到大排序。
- 用饼干匹配胃口
从小到大动饼干,当饼干数量不足以满足胃口,找下一堆饼干,直到饼干数量满足胃口
for(int i=0;i<s.size();i++){
if(index<g.size()&&g[index]<=s[i]){
index++;
count++;
}
}
- 用胃口寻找饼干
从小到大动胃口,移动胃口找饼干。当胃口大于饼干则用while循环找满足胃口的饼干位置,但是在这里我卡了一段时间,因为我用从小到大遍历时忘记考虑一种情况:当胃口为{1,2,3},饼干为{3}时,然后按如下代码,则会发现最后输出为3。
int index=0;
int count=0;
for(int i=0;i<g.size();i++){
while(index<s.size()&&s[index]<g[i]){
index++;
}
if(index<s.size()&&s[index]>=g[i])count++;
}
这是因为当index=0时i=0可以满足第一个人的胃口,但index没有改变,所以当i=2,i=3时一直在重复计算,修改后代码如下,也是可以顺利通过力扣
代码实现
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int index=0;
int count=0;
for(int i=0;i<s.size();i++){
if(index<g.size()&&g[index]<=s[i]){
index++;
count++;
}
}
return count;
}
};
总结
这道题有很多方法可以解决,重点是掌握思路,除了从小到大,也可以从大到小查找
376. 摆动序列
思路
用前一个两元素差pre和当前两元素之差cur相比较
摆动情况:
- cur>0&&pre<=0
- cur<0&&pre>=0
特殊情况:
- 只有一个元素或者没有元素,返回数组本身大小即可
- 含两个元素:当两元素之差为0,则序列大小为一,否则则为2
```cpp
if(nums.size()<3){
if(nums.size()==2&&nums[0]==nums[1])return 1;
return nums.size();
}
-
单调坡上的平坡
这个最容易被忘记,虽然我想到了但是不知道咋改代码,看了卡哥答案才知道自己一直理解错了。
因为当pre>0,cur=0(即cur在1-2间,cur在2-2间)时还为一个摆动序列,此时更新pre=cur=0;当cur=0就不满足条件了,此时pre不需要更新。直到cur>0,此时又是一个摆动序列。 -
凸坡上的平坡
当pre>0,cur=0时记录一组数据,当cur继续为0时则不需要再更新pre,直到下一个摆动序列再更新pre
for(int i=1;i<nums.size();i++){
cur=nums[i]-nums[i-1];
if(pre>=0&&cur<0||pre<=0&&cur>0){
count++;
pre=cur;
}
}
代码实现
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int pre=0;
int cur;
int count=1;
if(nums.size()<3){
if(nums.size()==2&&nums[0]==nums[1])return 1;
return nums.size();
}
for(int i=1;i<nums.size();i++){
cur=nums[i]-nums[i-1];
if(pre>=0&&cur<0||pre<=0&&cur>0){
count++;
pre=cur;
}
}
return count;
}
};
53. 最大子序和
思路
想清楚了这道题就会很简单。
首先直接计算前n个值之和,当sum和<0则直接舍弃,从下一个数开始计算sum。因为不管怎么样一个负数都只会连累接下来的最大值。在sum增加时也要记录下目前值是否最大,最后返回sum。代码很简单不多说。
代码实现
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int sum=0,result=INT_MIN;
for(int i=0;i<nums.size();i++){
sum+=nums[i];
if(result<sum)result=sum;
if(sum<0){
sum=0;
}
}
return result;
}
};