贪心算法
- 简介
- [简单] 455. 分发饼干
- [中等] 376. 摆动序列
- [中等] 53. 最大子数组和
- [中等] 122. 买卖股票的最佳时机 II
- [中等] 55. 跳跃游戏
简介
记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录的刷题路线。会附上一些个人的思路,如果有错误,可以在评论区提醒一下。
[简单] 455. 分发饼干
原题链接
贪心思路,优先把大的饼干分给胃口大的。
class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(s);Arrays.sort(g);int ans = 0;int j = s.length - 1;for(int i = g.length - 1; i >= 0 && j >= 0; i--){if(s[j] >= g[i]){j--;ans++;}}return ans;}
}
[中等] 376. 摆动序列
原题链接
初次提交无法通过[0,1,1,2,2]
这样的示例,没有判断出带平坡的单调递增,需要注意,只在result++的时候才去记录prediff的值,因为没有判断出result++的节点理论上是被删掉了,下一轮循环使用的还是同一个prediff
prediff初值设置为0是假设nums[0] 前面有一个跟他一样的节点。
class Solution {public int wiggleMaxLength(int[] nums) {int prediff = 0;int curdiff;int length = nums.length;if(length <= 1) return length;int result = 1;for(int i = 0; i < length - 1; i++){curdiff = nums[i + 1] - nums[i];if((prediff <= 0 && curdiff > 0) || (prediff >= 0 && curdiff < 0)) {result++;prediff = curdiff;}}return result;}
}
[中等] 53. 最大子数组和
原题链接
从左到右开始累加,如果[0 - i] 的累加<=0,说明这一段肯定不是结果的一部分,可以直接抛弃。
class Solution {public int maxSubArray(int[] nums) {int result = Integer.MIN_VALUE;int sum = 0;for(int i = 0; i < nums.length; i++){sum += nums[i];if(sum > result){result = sum;}if(sum <=0 ) sum = 0;}return result;}
}
[中等] 122. 买卖股票的最佳时机 II
原题链接
就按每天的差值来进行交易,差值为正就购入,算入总和。
class Solution {public int maxProfit(int[] prices) {int ans = 0;for(int i = 1; i < prices.length; i++){int count = prices[i] - prices[i - 1];if(count > 0) ans += count;}return ans;}
}
[中等] 55. 跳跃游戏
原题链接
不需要考虑具体跳到哪里,只要知道能跳的最大范围即可,比如nums = [3,2,1,0,4]
中,从第一个位置开始跳,不管跳到 nums[1]/nums[2]/nums[3]
,他们最多也都是够到下标为3,所以最后会是false。
class Solution {public boolean canJump(int[] nums) {int cover = 0;for(int i = 0; i <= cover ; i++) {cover = Integer.max(i + nums[i], cover);if(cover >= nums.length - 1) return true;}return false;}
}