理论基础
贪心:局部最优,推出整体最优。
常识逻辑顺序推导/找不出反例
LeetCode:455.分发饼干
1.思路
题目示例都是有序的,不排序也能实现,但没有明确说明是有序的,提前拍个序比较稳妥.
①双层for循环暴力解法,遇到符合条件的用break终止本层for循环,返回计数器结果即可.
②
2.代码实现
1class Solution { 2 public int findContentChildren(int[] g, int[] s) { 3 int count = 0; 4 Arrays.sort(g); 5 Arrays.sort(s); 6 for (int i = s.length - 1; i >= 0; i--) { 7 for (int j = g.length - 1; j >= 0; j--) { 8 if (s[i] >= g[i]) { 9 count++; 10 break; 11 } 12 } 13 } 14 return count; 15 // 计数器计数 16 } 17}
3.复杂度分析
时间复杂度:O(nlogn).数组排序的时间复杂度为O(nlogn),遍历数组的时间复杂度为O(n).
空间复杂度:O(n).创建count数值??
LeetCode:376. 摆动序列
1.思路
双指针法,求当前索引位置下的前后查值是否符合一正一负的条件,符合则count++,preDiff = curDiff
2.代码实现
1class Solution { 2 public int wiggleMaxLength(int[] nums) { 3 if (nums.length <= 1) { 4 return nums.length; 5 } 6 int curDiff = 0; 7 int preDiff = 0; 8 int count = 1; 9 for (int i = 1; i < nums.length; i++) { 10 curDiff = nums[i] - nums[i - 1]; 11 // 这里=只能给preDiff,curDiff上面被赋值之后,有可能会发生改变 12 if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) { 13 count++; 14 preDiff = curDiff; 15 } 16 } 17 return count; 18 } 19}
3.复杂度分析
时间复杂度:O(n).
空间复杂度:O(1).
LeetCode:53. 最大子序和
1.思路
①两层for循环穷举所有子数组的和,比较得出最大值并返回即可
②
2.代码实现
1// 暴力解法 2class Solution { 3 public int maxSubArray(int[] nums) { 4 // 找到连续子数组,分别计算范围内的和,比较各个和 5 int result = Integer.MIN_VALUE; 6 for (int i = 0; i < nums.length; i++) { 7 int curSum = 0; 8 for (int j = i; j < nums.length; j++) { 9 curSum += nums[j]; 10 result = Math.max(result, curSum); 11 } 12 } 13 return result; 14 } 15}
// 时间复杂度:O(n^2)
// 空间复杂度:O(1)
1// 贪心算法:剪枝操作 2class Solution { 3 public int maxSubArray(int[] nums) { 4 int result = Integer.MIN_VALUE; 5 int curSum = 0; 6 for (int i = 0; i < nums.length; i++) { 7 curSum += nums[i]; 8 result = Math.max(result, curSum); 9 // 当前和为<= 0 时,剪枝操作 10 if (curSum <= 0) { 11 curSum = 0; 12 } 13 } 14 return result; 15 } 16}
3.复杂度分析
时间复杂度:O(n).
空间复杂度:O(1).