
贪心算法
贪心
热心市民薛先生
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
单调递增的数字
看见这个数字范围就知道不可以使用暴力。这道题先要想清楚,如果不用代码写,用手算会怎么算。 举个例子:98 最大的单调递增数是多少?那97,96,95,94呢? 先用暴力计算,就是从小于98的数中一个一个对比,97,96…92,91,90,89,找到了那个数就是89.剩下的那些数答案也全都是89 先找一下规律,都是把前一位数-1,然后把后一位数置为9,先试一试其他数看对不对。 65最大递增的数是多少? 前一位数6-1=5,后一位数置为9,那就是59。用暴力方法确认一下,64,63,62,61,60.原创 2022-05-13 11:35:14 · 218 阅读 · 0 评论 -
区间排序问题
代码随想录总结 406.根据身高重建队列 452.用最少数量的箭引爆气球 435.无重叠区间 763.划分字母区间 56.合并区间 区间问题一般都要排序,这时候要考虑是按左边排序还是按右边排序。 举例:左边升序,左边相等则右边降序排序 Arrays.sort(name, (o1,o2) ->{ if(o1[0] == o2[0]) return o2[1] -o1[1]; return o1[0] - o2[0]; } ); 如果左边相等右边也是升序的话,不用if判断条件,此时 Arrays.so原创 2022-05-12 22:27:32 · 742 阅读 · 0 评论 -
分发糖果(难)
这道题思路不太好想,需要两步: 1、从左往右,从1位置开始遍历数组,若当前位置分数比左边的分数大,那么糖果数等于左边的+1 for(int i = 1;i<n;i++){ if(ratings[i] > ratings[i-1]){ candy[i] = candy[i-1] + 1; } } 2、从右往左,从n-2位置开始,如果当前位置分数比右边的大,那么取当前位置糖果数和右边糖果数+1二者的最.原创 2022-05-07 11:57:25 · 309 阅读 · 2 评论 -
加油站(比较难)
方法一 public int canCompleteCircuit(int[] gas, int[] cost) { // 油箱里油的最小值 int min = Integer.MAX_VALUE; int sum = 0; for(int i = 0;i<gas.length;i++){ // 每趟剩余的油 int rest = gas[i] - cost[i]; // 油.原创 2022-05-06 13:37:57 · 133 阅读 · 0 评论 -
K 次取反后最大化的数组和
本题看着跟贪心好像没什么关系,不用贪心也可以做,但是要养成贪心的思维。要找局部最优和全局最优的这种策略。 翻转时的局部最优就是把最小的负数翻转为正数,全局最优就是最后的值才是最大的。 所以要给数组先排序,在翻转 当把数组中负数都翻转成正数以后,会出现三种情况: 1、k值为0,数组中没有负数 ------ 直接求和 2、k值为0,数组中还有负数 ------直接求和 3、k值不为0,数组中没有负数(k不为0时,数组中一定没有负数)此时又分为两种情况: (1) k值为偶数,那么就不用翻转了 (2.原创 2022-05-06 10:23:20 · 217 阅读 · 0 评论 -
买卖股票的最佳时机
某一天买,在后面的某一天卖,买卖只能进行一次。 public int maxProfit(int[] prices) { int min = prices[0] ,res = 0; for(int i = 1;i<prices.length;i++){ if(prices[i] <min) min = prices[i]; else res = Math.max(prices[i]-min,res); .原创 2022-05-05 21:14:51 · 168 阅读 · 0 评论 -
跳跃游戏(贪心)
leetcode55 class Solution { public boolean canJump(int[] nums) { int maxlen = 0; for(int i = 0;i<nums.length;i++){ if(i>maxlen) return false; if(maxlen>=nums.length-1) return true;原创 2022-02-19 17:36:41 · 194 阅读 · 0 评论