leetcode刷题之python解决贪心相关问题

一、在我们开始今天的刷题内容之前呢,还是要先了解一下什么是贪心,从我们日常生活中去理解贪心这个词呢,顾名思义就是一个人不满足当前得到的,总是想要更多,当然在我们学习里贪心一些无可厚非,如果在一些(大家懂的)东西上面太贪心可能会给我们带来不好的结果!

当然我们还是要认真来看一看贪心的概念:

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。这看起来似乎有些难以理解,那就从我们今天的刷题开始吧,大家一起边刷题边理解!

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):

使用贪心的思想,构建满足三角形的条件!

今天的题目都是根据贪心的思想出发,每道题目里面都能看到相似的部分影子,前面的几道题目有比较详细的叙述,因为今天的时间比较紧张,后面的一些题目的过程就比较简略!当然,这些题目也都是我自己的一些想法,有错误的地方,大家可以批评指正,有更好的想法也可以一起分享,我的目标就是变得越来越好了,这是记录我的成长过程,也是希望和大家一起成长!

一起加油!一起坚持!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MUSE_X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值