455. 分发饼干
思路
局部最优(饼干发出去),推导出全局最优(饼干尺寸升序排序,把小孩胃口升序排序)
解题方法
描述你的解题方法
复杂度
-
时间复杂度:
O ( n l o g n ) O(nlogn) O(nlogn) -
空间复杂度:
O ( 1 ) O(1) O(1)
Code
class Solution {
// 局部最优(饼干发出去),推导出全局最优(饼干尺寸升序排序,把小孩胃口升序排序)
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int cnt = 0;
// 双指针
int j = 0;
for (int i = 0; i < s.length && j < g.length; i++) {
if (s[i] >= g[j]) {
cnt++;
j++;
}
}
return cnt;
}
}
376. 摆动序列
思路
差值符号发生转动就 cnt++
解题方法
一次遍历,类似双指针计算差值判断符号
复杂度
-
时间复杂度:
O ( n ) O(n) O(n) -
空间复杂度:
O ( 1 ) O(1) O(1)
Code
class Solution {
int cnt = 1;
// 标识上一次差值符号
boolean diffSymbol;
public int wiggleMaxLength(int[] nums) {
if (nums.length == 0) {
return --cnt;
} else if (nums.length == 1) {
return cnt;
}
// 差值符号发生转动就 cnt++
boolean start = false;
for (int i = 1; i < nums.length; i++) {
int diff = nums[i] - nums[i - 1];
if (diff == 0) {
continue;
} else if (!start){
start = true;
diffSymbol = diff > 0;
cnt++;
}
if (diffSymbol ^ diff > 0) {
diffSymbol = diff > 0;
cnt++;
}
}
return cnt;
}
}
53. 最大子序和
思路
如果 -2 1 在一起,计算起点的时候,一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方
局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会比理论值小。
全局最优:选取最大“连续和”
局部最优的情况下,并记录最大的“连续和”,可以推出全局最优。
解题方法
遍历时持续更新全局最优解
当遇到“连续和”小于等于0时,重置连续和,也即立即中断连续子数组
复杂度
-
时间复杂度:
O ( n ) O(n) O(n) -
空间复杂度:
O ( 1 ) O(1) O(1)
Code
class Solution {
public int maxSubArray(int[] nums) {
int result = Integer.MIN_VALUE;
int cnt = 0;
for (int i = 0; i < nums.length; i++) {
cnt += nums[i];
result = Math.max(result, cnt);
// 重置最大值的计数
if (cnt <= 0) {
cnt = 0;
}
}
return result;
}
}