第一次做贪心~
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int i = 0;
for(int j = 0; j < s.length; ++j){
if(i < g.length && s[j] >= g[i]){
++i;
}
}
return i;
}
}
想了半天,没弄明白最后单调平坡的情况,抄了卡哥的答案。
下题加油吧!
class Solution {
public int wiggleMaxLength(int[] nums) {
if (nums.length <= 1) {
return nums.length;
}
int curDiff = 0;
int preDiff = 0;
int count = 1;
for (int i = 1; i < nums.length; i++) {
curDiff = nums[i] - nums[i - 1];
if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) {
count++;
preDiff = curDiff;
}
}
return count;
}
}
代码不难,但很精髓。关键想明白两点:
- 如果加上当前的数,还没有当前的数本身大,那么sum应该从当前的数算起。
- 当前的和与加上之后的和要时刻做比较。比如,对于
[-2,1,-3,4,-1,2,1,-5,4], 用1得出[4,-1,2,1]后,当前值是6,那么要不要加这个-5呢?第一条告诉你要加,但不对。所以要时刻比对当前的值。
class Solution {
public int maxSubArray(int[] nums) {
int res = nums[0], sum = nums[0];
for(int i = 1; i < nums.length; ++i){
sum = Math.max(sum+nums[i], nums[i]);
if(sum > res){
res = sum;
}
}
return res;
}
}
文章介绍了三个算法问题的Java解法:1.AssignCookies使用贪心策略找到能分配给孩子的饼干;2.WiggleSubsequence找到数组中的波动子序列;3.MaximumSubarray求解最大子数组和,关键在于动态维护当前和的最大值。

876

被折叠的 条评论
为什么被折叠?



