一、在我们开始今天的刷题内容之前呢,还是要先了解一下什么是贪心,从我们日常生活中去理解贪心这个词呢,顾名思义就是一个人不满足当前得到的,总是想要更多,当然在我们学习里贪心一些无可厚非,如果在一些(大家懂的)东西上面太贪心可能会给我们带来不好的结果!
当然我们还是要认真来看一看贪心的概念:
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。这看起来似乎有些难以理解,那就从我们今天的刷题开始吧,大家一起边刷题边理解!
1.两个数对之间的最大乘积差(1913):
class Solution: def maxProductDifference(self,nums:List[int])->int: nums.sort() n=len(nums) return nums[n-1]*nums[n-2]-nums[0]*nums[1]
这道题的思路也是非常简单,仅仅使用了三行代码,其实再短点也行,这样也是短的更好理解一些;
首先呢,我们先对nums列表进行了一个排列,之后列表里的元素是一个升序排列的列表;
之后我们返回了列表的长度,为了方便之后我们取列表的索引;
最后利用贪心的思想,只要我们取最大的两个元素相乘再减去最小的两个元素相乘即可。
开胃菜,简单又轻松!!!
2.三角形的最大周长(976):
话不多说,直接上代码:
class Solution:
def largestPerimeter(self,nums:List[int])->int:
nums.sort()
n=len(nums)
for i in range(n-1,1,-1):
side_max=nums[i]
if nums[i-1]+nums[i-2]>side_max:
return nums[i]+nums[i-1]+nums[i-2]
break
else:
continue
return 0
目的是为了求三角形的最大周长;
在保证能构成三角形的情况下,边的长度越大越好,所以先对列表里的元素进行了排列;
因为是升序排列,所以需要倒着来遍历,依次以最大的长度作为最长的边,只要相邻的前面两条边与此没有办法构成三角形,则其也不能构成三角形,依次寻找直至找到为止,返回的即为最大的周长,若未找到最大周长的三角形,则返回0.
3.数组拆分1(561):
class Solution:
def arrayPairSum(self,nums:List[int])->int:
nums.sort()
return sum(nums[::2])
先对列表排序;
之后每两个取一个元素最后求和即可。
4.救生艇(881):
class Solution:
def numRescueBoats(self,people:List[int],limit:int)->int:
people.sort()
n=len(people)
light,heavy=0,n-1
count=0
while light<heavy:
if people[light]+people[heavy]>limit:
heavy-=1
else:
light+=1
heavy-=1
count+=1
return count
救生艇是一道实际应用题目,具体问题具体分析;
救生艇问题用到了贪心算法,要使需要的船数尽可能地少,应当使载两人的船尽可能地多。
设 列表people 的长度为n;
考虑体重最轻的人:
(1)若他不能与体重最重的人同乘一艘船,那么体重最重的人无法与任何人同乘一艘船,此时应单独分配一艘船给体重最重的人。从people 中去掉体重最重的人后,我们缩小了问题的规模,变成求解剩余 n-1 个人所需的最小船数,将其加一即为原问题的答案。
(2)若他能与体重最重的人同乘一艘船,那么他能与其余任何人同乘一艘船,为了尽可能地利用船的承载重量,选择与体重最重的人同乘一艘船是最优的。从people 中去掉体重最轻和体重最重的人后,我们缩小了问题的规模,变成求解剩余n−2 个人所需的最小船数,将其加一即为原问题的答案。
5.摆动排序Ⅱ(324):
这道题目了基本上满足了题目要求,但是进阶的要求还没有满足,因为我也是一个初学者,前期也先以过题为主,一些进阶的要求在我能力提升之后还会继续去做出更好的结果!
6.分发饼干(455):
看了题目描述之后,起初还是有些不太明白的,之后回忆起之前几道题目,发现还是有很多共同点的;
首先,分别返回了两个列表的长度,以及对两个列表进行了升序排序;
设置了最大的索引值,如果最大处能满足孩子的胃口,则分别向前推进索引值;
最后返回计数器即可。
7. 最少操作使数组递增(1827):
现在的我解题还没有思考过多,都是以最简单的思路进行考虑,代码的思路也是最容易想到的,至于算法层次上的时间复杂度与空间复杂度,等我思想更成熟之后再提升吧!
这道题的思路也是,前两个判断是对最简单的情况的一个考虑;
之后进行遍历,计算前后两个数之间的差距,每次只能加1;
最后返回count即可。
8.使数组唯一的最小增量(945):
这道题目与上一道思路类似!
9.有效三角形的个数(611):
使用贪心的思想,构建满足三角形的条件!
今天的题目都是根据贪心的思想出发,每道题目里面都能看到相似的部分影子,前面的几道题目有比较详细的叙述,因为今天的时间比较紧张,后面的一些题目的过程就比较简略!当然,这些题目也都是我自己的一些想法,有错误的地方,大家可以批评指正,有更好的想法也可以一起分享,我的目标就是变得越来越好了,这是记录我的成长过程,也是希望和大家一起成长!
一起加油!一起坚持!!!