首页 > 其他分享 >代码随想录Day30|贪心1

代码随想录Day30|贪心1

时间:2023-06-20 19:22:23浏览次数:43  
标签:nums int pointer2 随想录 Day30 len ans 贪心

   理论基础 

●  455.分发饼干 

●  376. 摆动序列 

●  53. 最大子序和


什么是贪心

贪心的本质是选择每一阶段的局部最优,从而达到全局最优

这么说有点抽象,来举一个例子:

例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?

指定每次拿最大的,最终结果就是拿走最大数额的钱。

每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。

再举一个例子如果是 有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。动态规划的问题在下一个系列会详细讲解


有同学问了如何验证可不可以用贪心算法呢?

最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧


贪心一般解题步骤

贪心算法一般分为如下四步:

  • 将问题分解为若干个子问题
  • 找出适合的贪心策略
  • 求解每一个子问题的最优解
  • 将局部最优解堆叠成全局最优解

这个四步其实过于理论化了,我们平时在做贪心类的题目 很难去按照这四步去思考,真是有点“鸡肋”。

做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了


455.分发饼干

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g.sort()
        s.sort()
        g_len = len(g)
        s_len = len(s)
        ans = 0
        pointor1 = g_len-1
        pointor2 = s_len-1
        while (pointor1 >= 0 and pointor2 >= 0):
            if(s[pointor2] >= g[pointor1]):
                ans += 1
                pointor1 -= 1
                pointor2 -= 1
            else:
                pointor1 -= 1
        return ans
    

 


376. 摆动序列

使用三个指针

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        ans = 1
        n = len(nums)
        pointer1 = 0
        pointer2 = 1
        while pointer2 < n and nums[pointer1] == nums[pointer2]:
            pointer1 += 1
            pointer2 += 1
        if pointer2 == n:
            return 1
        ans += 1
        pointer3 = pointer2 + 1
        while pointer3 < n:
            if (nums[pointer2]-nums[pointer1])*(nums[pointer3]-nums[pointer2]) < 0:
                ans += 1
                pointer1 = pointer2
            pointer2 = pointer3
            pointer3 += 1
        return ans

但其实还有更简单的方法就是指记录和计算差值

如果这两个差值一正一反,就加一移动

如果同符号或者又零的存在就不移动上一个差值


53. 最大子序和

可能是负数

所以我们考虑的思路是

如果前面的和为负数

那我们就设置为当前数的大小

因为任何数字加上负数必定更小

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        ans = nums[0]
        ans_now = 0
        for i in nums:
            if ans_now <= 0:
                ans_now = i
            else:
                ans_now += i
            ans = max(ans, ans_now)
        return ans

 

 

 

标签:nums,int,pointer2,随想录,Day30,len,ans,贪心
From: https://www.cnblogs.com/fangleSea/p/17494463.html

相关文章

  • 【计算机算法设计与分析】最优子结构和贪心选择性质的证明
    最优子结构性质(反证法)计算某问题的最优解包含的计算该问题的子问题也是最优解。事实上,如果找到子问题的更优解,则可以替换当前子问题的解,得到一个比最优解更优的解,这是一个矛盾。贪心选择性质(数学归纳法)先设一个最优解(为所给定的总元素集合,且和均按照某种有利于算法贪心进行的顺序......
  • 代码随想录算法训练营第十二天| 递归遍历 (必须掌握)迭代遍历 统一迭代
    递归遍历重点:1,TreeNode的自定义2,val=0== val=NULL;代码:1voidpreRecursor(TreeNode*root,vector<int>&result)2{3if(root==NULL)4return;5result.push_back(root->val);6preRecursor(root->left,result);7......
  • P1969 积木大赛(C++_贪心_模拟)
    题目描述春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是。在搭建开始之前,没有任何积木(可以看成n块高度为0的积木)。接下来每次操作,小朋友们可以选择一段连续区间,然后将第第L块到第R......
  • P1095 守望者的逃离(C++_贪心_模拟/dp)
    题目描述恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。守望者的跑步速度为17m/s,以这样的速度......
  • P1478 陶陶摘苹果(升级版)(C++_贪心)
    题目描述又是一年秋季时,陶陶家的苹果树结了n个果子。陶陶又跑去摘苹果,这次他有一个a公分的椅子。当他手够不着时,他会站到椅子上再试试。这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力气只剩下s了。当然,每次摘苹果时都要用一定的力气。陶陶想知道在s<0s<0之前最多......
  • 背包DP-贪心-1262. 可被三整除的最大和
    1262.可被三整除的最大和DescriptionDifficulty:1762RelatedTopics:贪心,数组,动态规划,排序给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。示例1:输入:nums=[3,6,5,1,8]输出:18解释:选出数字3,6,1和8,它们的和是18(可被3整除的最大和)。示......
  • 代码随想录算法训练营第十一天| 239. 滑动窗口最大值 347.前 K 个高频元素
    239.滑动窗口最大值 难点:1,想好怎么快速找到区块内的最大数值,往常使用的是在遍历一次,但是是O(m*n)思路:1,使用单调队列,所有的数值都必须是从大到小,2,用队列保持必要的顺序,而且对于大于K的循环,每次都要求poppush这两个操作代码:1voidpop(deque<int>&slidingWin......
  • 代码随想录算法训练营第十天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
    20.有效的括号  特点:左括号之后,可能还会有左括号,但是只要有右括号,那么它必须立刻和最近的左括号代码:1charreturnRightChar(char&c)2{3switch(c)4{5case'[':return']';6case'(':return')';7case'{':r......
  • 代码随想录Day24|回溯算法+JAVA大作战
     今日任务39. 组合总和40.组合总和II131.分割回文串 93.复原IP地址  78.子集   90.子集II   39.组合总和classSolution{List<List<Integer>>ans=newArrayList<>();LinkedList<Integer>now_ans=newLinkedList<>();publicLi......
  • 代码随想录day08
     第四章 字符串part01344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串344.反转字符串 classSolution{publicvoidreverseString(char[]s){//双指针法依次交换首尾两个fo......