455.分发饼干
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int i = g.length - 1, j = s.length - 1;
int res = 0;
while(i >= 0 && j >= 0){
if (g[i] > s[j]) i--;
else{
i--;
j--;
res++;
}
}
return res;
}
376. 摆动序列
本题难点在于想到在什么情况下需要下标归零并且对数组重新排序
- 下标到达数组最右边但是k还没有归零
- 下标指向了一个大于等于0的数,说明当前小于0的数字都已取反,需要使用贪心策略把数组重新排序后对最小的数字取反
public int largestSumAfterKNegations(int[] nums, int k) {
Arrays.sort(nums);
int idx = 0;
while(k > 0){
if (idx == nums.length || nums[idx] >= 0){
idx = 0;
Arrays.sort(nums);
}
nums[idx++] *= -1;
k--;
}
return sum(nums);
}
private int sum(int[] nums){
int res = 0;
for (int num: nums) res += num;
return res;
}
53. 最大子序和
解题关键是理解在什么情况下需要更新subarray的左端点 (当和小于0的时候)
其他情况下只需要根据下标递加
public int maxSubArray(int[] nums) {
int res = Integer.MIN_VALUE;
int sum = 0;
int i = 0;
while(i < nums.length){
sum += nums[i++];
if (sum > res) res = sum;
if (sum < 0) sum = 0;
}
return res;
}