参考文献链接:代码随想录
本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。
455.分发饼干
解题思路
这道题目思路还是比较好想的,既然要满足最多的小朋友,那就有两种思路。
1.小饼干先满足小胃口
2.先喂饱大胃口
这里我给出的代码是第一种方法,把两个数组都排序,遍历饼干,然后当小饼干能满足小胃口时,切换到下一个胃口,这样下来饼干不会浪费,最小的饼干肯定是给了最小的胃口。
代码示例
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int count = 0;
int start = 0;
for(int i = 0;i < s.length && start < g.length;i++){
if(s[i] >= g[start]){
count++;
start++;
}
}
return count;
}
}
376. 摆动序列
解题思路
先说一下这道题目的大致思路:摆动序列,即需要前一个差值和后一个差值符号相反即可,所以我们要遍历数组并比较本次差值和上次差值。
为什么pre==0也加入判断条件呢?
防的是两个元素的情况,那第一次判断pre = 0,result就可以++,然后return 2即可。
为什么pre = now在if中写呢,难道不是每次循环都要把now赋给pre吗?
其实这也是一个特殊情况,按正常思维应该是每次循环都要赋值,但提交后发现不太对,研究后才发现有这种特殊情况。
代码示例
class Solution {
public int wiggleMaxLength(int[] nums) {
if(nums.length == 1){
return 1;
}
int pre = 0;
int result = 1;
for(int i = 1;i < nums.length;i++){
int now = nums[i] - nums[i - 1];
if((now > 0 && pre <= 0) || (now < 0 && pre >= 0)){
result++;
pre = now;
}
}
return result;
}
}
53. 最大子序和
解题思路
这道题目的局部最优解就是:当我们的sum总和小于0并且小于遍历的下一个值,那么把这个值赋给sum。
比如说sum现在是-1,遍历的这个值是1,那就直接sum=1.
如果sum目前是正数,那么就一直添加即可,不能说遍历的值是复数就不添加了。
比如说sum现在是1,下一个值-1,但下下一个是2,所以说-1也要加进来,才能加到2。
遍历的同时我们要一直比较sum和max的大小,一旦遇到sum大,就赋给max。这样能确保sum的最大情况被记录下来也就是答案。
代码示例
class Solution {
public int maxSubArray(int[] nums) {
int max = Integer.MIN_VALUE;
int sum = 0;
for(int i = 0;i < nums.length;i++){
if(sum < 0 && nums[i] > sum){
sum = nums[i];
}else{
sum += nums[i];
}
if(sum > max){
max = sum;
}
}
return max;
}
}