第十三天打卡——贪心

406.根据身高重建队列 

和分发糖果类似,两个维度权衡问题,但是维度不好找。

本题关键在于找到重建队列的两个维度,先确定一个维度,再确定另一个维度。

思路:

1、先按照身高维度来排序,从大到小排(身高相同的话则k小的站前面),身高相同的情况下,k值小的排在前。

2、再根据k的数值作为数组下标来排序。从前向后排,k值即位当前元素的在数组中的下标位置,后面遇到相同k值时,后面的元素插入到该下标处,之前插入的元素后移。

代码实现遇到的问题:对二维数组按某列排序,list和int数组的互变。还是java语法不熟!


860.柠檬水找零 

思路比较清晰,一刷直接ac,有三种情况分析

  • 情况一:账单是5,直接收下。
  • 情况二:账单是10,消耗一个5,增加一个10
  • 情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5

贪心策略体现在情况三

局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。


重叠区间

452. 用最少数量的箭引爆气球 

思路是清晰的,但是代码实现不太好写

局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。

先根据起始位置,对气球进行排序。

遇到的问题:

如何射箭:找到组成重叠区间的多个气球数组中的最小右边界,在此坐标射箭。

如何用代码表示是否重叠?

答:判断两个气球是否挨着。if(points[i][0] > points[i-1][1])

如果不挨着,说明没有重叠区间,需要一只箭;否则就是挨着或重叠,更新当前的最小右边界。


435. 无重叠区间 

上一题452.用最少数量的箭引爆气球 (opens new window)的变型。

区别是上一题找不挨着的气球,这一题找重叠且不挨着的区间作处理。

代码实现遇到的问题

if (intervals[i][0] < intervals[i-1][1]){ //有重叠情况
    result++;
    intervals[i][1] = Math.min(intervals[i-1][1], intervals[i][1]);
    //同样是取二者中的最小值,因为不确定前后两个区间哪个小,我们要去除掉区间更大的那一个。不可以直接令intervals[i][1] = intervals[i-1][1];
}

56. 合并区间 

和前两题思路一致。

先排序,找重叠且挨着的区间。然后合并

代码实现的难点在于,如何合并保存合并后的新区间

这里用到了LinkedList链表,不受索引下标的限制,且增删方便。

最后再将LinkedList类型的链表转为二维数组。


763.划分字母区间 

在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了

763.划分字母区间

可以分为如下两步:

  • 统计每一个字符最后出现的位置
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点

738.单调递增的数字 

一刷自己ac了。

思路:设n=150432

1、int转LinkedList

2、从后向前遍历,判断后一个数和前一个数的大小。如果后<=前,后面的所有位数包括该后一个数大小都置为9,前一个数的值-1。

3、遍历结束,如果首位为0,从列表中去除。

4、Linkedlist转int


968.监控二叉树 

贪心和二叉树的结合

一刷先跳过

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值