首页 > 其他分享 >代码随想录Day32|贪心II

代码随想录Day32|贪心II

时间:2023-06-21 23:33:21浏览次数:64  
标签:max nums int 随想录 Day32 candy II range ans

 今日任务

●  122.买卖股票的最佳时机II 

●  55. 跳跃游戏 

●  45.跳跃游戏II 

●  1005.K次取反后最大化的数组和 

●  134. 加油站

●  135. 分发糖果  


122.买卖股票的最佳时机 II

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        ans = 0 
        for i in range(1, len(prices)):
            ans += max(0, prices[i]-prices[i-1])
        return ans

55. 跳跃游戏

本题贪心的关键是:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的

那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!

def canJump(self, nums: List[int]) -> bool:
        largest = 0
        n = len(nums)
        for i in range(n-1):
            largest = max(largest, i+nums[i])
            if largest <= i:
                return False
        return largest >= n-1

45.跳跃游戏 II

本题解题关键在于:以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点

//方法一 暴力法
//思考每一步能去的最大范围 使用min的方式进行
class Solution: def jump(self, nums: List[int]) -> int: n = len(nums) ans = [10003 for _ in range(n)] ans[0] = 0 for i in range(n): temp = ans[i] + 1 for j in range(i+1, min(i+nums[i]+1, n)): ans[j] = min(ans[j], temp) return ans[-1]
//方法二 贪心算法
//想法是当前步数能覆盖的最大范围
//时间复杂度 O(N)
//空间复杂度 O(1)
class Solution: def jump(self, nums: List[int]) -> int: n = len(nums) count = 0 max_range = 0 next_max_range = 0 for i in range(n): next_max_range = max(next_max_range, i+nums[i]) if max_range >= n-1: break if i == max_range: count += 1 max_range = next_max_range return count

 


1005.K次取反后最大化的数组和

别怕 可以sort两次

多练胆子才会大

class Solution:
    def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
        n = len(nums)
        nums.sort()
        i = 0
        while i < n and nums[i] < 0 and k > 0:
            nums[i] = -nums[i]
            i += 1
            k -= 1
        if k > 0 :
            nums.sort()
            k = k%2
            if k == 1:
                nums[0] = -nums[0]
        ans = 0
        for j in nums:
            ans += j
        return ans

 


134. 加油站

首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。

从每一个点出发计算能连续到达的最大距离,因为已经确保了可以跑完

那我们就要求哪个点可以跑完

如果到达下一个点的油不够了 说明从出发点到现在这个点都不能作为出发点

因为正数+正数是大于正数的

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        if sum(gas) < sum(cost):
            return -1
        
        total = res = 0
        
        for i in range(len(gas)):
            total += (gas[i] - cost[i])
            if total < 0:
                total = 0
                res = i + 1
        
        return res

 


135. 分发糖果

只考虑比旁边人大的情况,这样不用考虑变成负数,且满足最少1个的要求。

换位思考,比右边小和比左边大是一个意思

这是精髓

先确定右边评分大于左边的情况(也就是从前向后遍历)

此时局部最优:只要右边评分比左边大,右边的孩子就多一个糖果,全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果

局部最优可以推出全局最优。

再确定左孩子大于右孩子的情况(从后向前遍历)

那么本题我采用了两次贪心的策略:

  • 一次是从左到右遍历,只比较右边孩子评分比左边大的情况。
  • 一次是从右到左遍历,只比较左边孩子评分比右边大的情况。
class Solution:
    def candy(self, ratings: List[int]) -> int:
        n = len(ratings)
        candy = [1 for _ in range(n)]
        for i in range(1, n):
            if ratings[i] > ratings[i-1]:
                candy[i] = candy[i-1]+1
        for i in range(n-2, -1, -1):
            if ratings[i] > ratings[i+1]:
                candy[i] = max(candy[i], candy[i+1]+1)
        return sum(candy)
       

 


 

标签:max,nums,int,随想录,Day32,candy,II,range,ans
From: https://www.cnblogs.com/fangleSea/p/17497303.html

相关文章

  • 代码随想录算法训练营第43天 | ● 1049. 最后一块石头的重量 II ● 494. 目标和
     第九章 动态规划 part05●  1049. 最后一块石头的重量 II ●  494. 目标和 ●  474.一和零    详细布置   1049. 最后一块石头的重量 II  本题就和 昨天的 416. 分割等和子集 很像了,可以尝试先自己思考做一做。 视频讲解:https://www......
  • 代码随想录算法训练营第十三天| 层序遍历 226.翻转二叉树 (优先掌握递归) 101. 对
    层序遍历注意:1,使用队列的形式,依次入队,同时对队列进行计数2,知道数目消失,才进行下一个队列代码:1vector<vector<int>>levelOrder(TreeNode*root)2{3vector<vector<int>>result;4if(root==NULL)returnresult;5queue<TreeNode*>selected;6......
  • 三菱FX2N对台达变频器的ASCII的通信控制程序资料PLC采用FX2N,加FX3G-485BD扩展模块,采
    三菱FX2N对台达变频器的ASCII的通信控制程序资料PLC采用FX2N,加FX3G-485BD扩展模块,采用MODBUSASCII控制方式,可以通过PLC实现对变频器的正反转,启动停止的控制,频率的设定,加减速,以及对输出频率的监控。已实测,效果如视频,FX3U可以一样用,别的变频器支持ASCII通讯也可以用,资料包括触摸屏......
  • FPGA sataII sataIII 固态存储 文件系统FPGA sata2 sata3 固态存储
    FPGAsataIIsataIII固态存储文件系统FPGAsata2sata3固态存储1.支持xilinx全系列FPGA器件2.提供文件系统3.提供硬件解决方案4.移植方便,相当于操作fifo接口就可以了,根据记录行程文件ID:5510000598067161402......
  • 代码随想录Day30|贪心1
       理论基础 ●  455.分发饼干 ●  376. 摆动序列 ●  53. 最大子序和什么是贪心贪心的本质是选择每一阶段的局部最优,从而达到全局最优。这么说有点抽象,来举一个例子:例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结......
  • Windows 2008服务器多界面和IIS的安装教程 140.210.16.x
    当你在使用服务器时是否有遇到这样一个问题?当你正在服务器里进行工作时,突然一个小伙伴在没有告知你的情况下进入了服务器里,导致你服务器失去连接了,这种情况是非常常见的现象。主要原因就是因为服务器没有安装多界面,服务器多开界面是占用的同一台服务器的资源,服务器多开数量没有限制......
  • 代码随想录算法训练营第十二天| 递归遍历 (必须掌握)迭代遍历 统一迭代
    递归遍历重点: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......
  • 代码随想录算法训练营第十一天| 239. 滑动窗口最大值 347.前 K 个高频元素
    239.滑动窗口最大值 难点:1,想好怎么快速找到区块内的最大数值,往常使用的是在遍历一次,但是是O(m*n)思路:1,使用单调队列,所有的数值都必须是从大到小,2,用队列保持必要的顺序,而且对于大于K的循环,每次都要求poppush这两个操作代码:1voidpop(deque<int>&slidingWin......
  • 大数据,信息与智能工程国际会议(BDIIE2023)
    2023年大数据、信息与智能工程国际会议(BDIIE2023)将于2023年9月17-18日在中国武汉举行。BDIIE2023 将以高质量的技术和体验计划为特色,在论文展示和备受瞩目的主题演讲中处理传统和当代的热门话题。我们诚邀您提交与大数据、信息工程和智能工程相关的所有主题的论文和摘要,期待您......
  • 1494. 并行课程 II (Hard)
    问题描述1494.并行课程II(Hard)给你一个整数n表示某所大学里课程的数目,编号为1到n,数组relations中,relations[i]=[xᵢ,yᵢ]表示一个先修课的关系,也就是课程xᵢ必须在课程yᵢ之前上。同时你还有一个整数k。在一个学期中,你最多可以同时上k门课,前提是这......