首页 > 编程语言 >Day28 贪心算法part2

Day28 贪心算法part2

时间:2024-08-13 12:48:58浏览次数:7  
标签:return Day28 nums int len part2 prices nextCover 贪心

任务

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

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

思路

考虑分解最终利润,比如第3天卖,第0天买,第3天卖。利润为p[3]-p[0] == p[3]-p[2]+p[2]-p[1]+p[1]-p[0],也即是你隔了几天的买卖,都可以分解成连续买卖,即第三天卖,第0天买,就是第0天买,第1天卖,第2天买,第3天卖的组合,因此每天买卖的利润可以涵盖隔天买卖的利润。
每天都买卖,只收集每天的正利润。

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

55. 跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

思路

考虑覆盖,每次走到能覆盖的最大部分,走的过程中记录更新覆盖。

class Solution:
    def canJump(self, nums: List[int]) -> bool:
        if len(nums) == 0: return True
        cover = 1 #右开区间
        #for i in range(cover+1): #py中for循环不能修改循环变量!!!
        i = 0
        while i < cover:
            cover = max(i+nums[i]+1,cover)
            if cover >= len(nums):
                return True
            i+=1
        return False

45. 跳跃游戏 II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i]
  • i + j < n
    返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。

思路

同样考虑覆盖,curCover和nextCover分别表示当前最大覆盖和下次最大覆盖,遍历整个数组的过程中更新这两个值,每次达到当前最大覆盖时,计数加1,当下次最大覆盖达到或超过数组长度时,统计结束。这个得模拟着来看,不是很直观和好想,关键难度在编码上,就是对nextCover和curCover在模拟过程中的修改。

class Solution:
    def jump(self, nums: List[int]) -> int:
        if len(nums) == 1: return 0
    
        curCover = 0
        nextCover = 0
        result = 0
        for i in range(len(nums)):
            nextCover = max(nextCover,nums[i]+i)
            if i == curCover:
                result += 1
                curCover = nextCover
                if nextCover >= len(nums)-1:
                    break
        return result   

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

思路

绝对值从大到小排序,然后顺序遍历,尽量将负数变成正数,如果遍历完K仍然大于0且为奇数,则将绝对值最小的值取反。关键在于Py中自定义排序和lambda表达式的写法

class Solution:
    def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
        nums.sort(key=abs,reverse=True)
        
        for i in range(len(nums)):
            if k > 0 and nums[i] < 0: # 尽可能的把绝对值较大的负数变正
                nums[i] *=-1
                k-=1
        if k%2 == 1: #K剩余奇数,如果k>0 说明数组已经全为正数,则找绝对值最小的取反
            nums[-1] *= -1
        
        res = 0
        for i in range(len(nums)):
            res += nums[i]
        return res

心得体会

  • 买卖股票的时机系列问题后续可用动规解决,比较通用,只是多次买卖这道题恰好可用贪心比较简单
  • 跳跃游戏中,更新覆盖的思路很难想到,特别是跳跃游戏II中的next和cur的更新。

标签:return,Day28,nums,int,len,part2,prices,nextCover,贪心
From: https://www.cnblogs.com/haohaoscnblogs/p/18356648

相关文章

  • 代码随想录day28 || 122 买卖最佳时机2,55 跳跃游戏,45 跳跃游戏2,1005 k次取反最大数组
    122买卖股票最佳时机2funcmaxProfit(prices[]int)int{ //思路,因为支持同一天买入卖出,所以利润最大应该是所有正利润的加总结果 varsumint fori:=1;i<len(prices);i++{ ifprices[i]-prices[i-1]>0{ sum+=prices[i]-prices[i-1] } } returns......
  • 算法-贪心
    1.分发饼干(LeetCode455)假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j]。如果s[j]>=g[i],我们可以将这个饼干j分配给......
  • 可持久化可反悔贪心
    接到上级通知,贪心思路假了,紧急需要调整思路思路假了?考虑反悔while(思路==false){cout<<"思路假了"<<endl;思路=true;cout<<"改对了"<<endl;}SampleOutput思路假了改对了思路假了改对了思路假了改对了思路假了改对了思路假了改对了思路假了改对了......
  • 贪心法-一般背包问题
    一般背包问题问题描述想象你有一个背包,它最多可以放M公斤的物品。你面前有n个物品,每个物品的重量是Wi,如果将这个物品完全放入背包,你将获得Pi的收益。问题目标你需要决定如何放置这些物品,以便在不超过背包容量的前提下,获得最大的收益。问题类型0/1背包问题:每个......
  • Day27 贪心算法part1
    任务455.分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j]。如果s[j]>=g[i],我们可以将这个饼干j分配给孩子i,这......
  • 贪心
    有些题dp是难做的或做不了的,这个时候可以去设计一种策略使得决策尽可能最优,也就是贪心。可以说贪心有时候是一种乱搞,但乱搞也能搞出出题人想不到的正解。反悔贪心有些题中直接dp的复杂度很高并且很难优化或者有后效性无法dp,朴素贪心考虑可以做到\(O(n)\)但是无法保证正确......
  • 贪心系列专题篇四
    目录整数替换解法一解法二俄罗斯套娃信封问题堆箱子可被三整除的最大和距离相等的条形码重构字符串声明:接下来主要使用贪心法来解决问题!!!整数替换题目思路下面将使用两种方法来解决这道题,第一种方法是递归+记忆化搜索;第二种方法是贪心。解法一使用递归+记忆......
  • 嵌入式开发C语言学习day28-华清作业8.5
    思维导图作业1:pipe.c//使用有名管道实现一个进程用于给另一个进程发消息//另一个进程收到消息后展示到终端上并且将消息保存到文件上一份#include<myhead.h>intmain(intargc,charconst*argv[]){//创建一个有名管道if(mkfifo("./linux",0664)......
  • 贪心算法-活动安排问题
    贪心算法贪心算法总是选择当前看起来最优的选择(局部最优解),希望得到的结果是一个整体最优解。但是,并非总是选择局部最优解就能够得到整体最优解,这一点需要在问题具有贪心选择性和优化子结构时才成立。贪心选择性贪心选择性:第一次做出贪心选择是正确的。优化子结构问题......
  • 「Day 2—贪心问题&分治&前缀和」
    贪心问题定义顾名思义,越贪越好。。。习题P1094[NOIP2007普及组]纪念品分组思路简单来说:最少的+最多的,利用双指针。代码#include<algorithm>#include<iostream>usingnamespacestd;intw,n;intp[30005];intmain(){cin>>w;cin>>n;for(inti=1;i......