当前位置: 首页 > wzjs >正文

aspcms 网站搬家网络整合营销4i原则

aspcms 网站搬家,网络整合营销4i原则,怎么在百度上做单位网站,动态网站有哪些文章目录 前言序列问题摆动序列单调递增的数字 贪心解决股票问题买卖股票的最佳时机II 两个维度权衡问题分发糖果根据身高重建队列 前言 今天继续带大家进行贪心算法的实战篇2,本章注意来解答一些运用贪心算法的中等的问题,大家好好体会,怎么…

文章目录

  • 前言
  • 序列问题
    • 摆动序列
    • 单调递增的数字
  • 贪心解决股票问题
    • 买卖股票的最佳时机II
  • 两个维度权衡问题
    • 分发糖果
    • 根据身高重建队列

前言

今天继续带大家进行贪心算法的实战篇2,本章注意来解答一些运用贪心算法的中等的问题,大家好好体会,怎么从构建局部最优到全局最优的。一文带大家弄懂。本文用于记录自己的学习过程,同时向大家进行分享相关的内容。本文内容参考于代码随想录同时包含了自己的许多学习思考过程,如果有错误的地方欢迎批评指正!

image-20250516165753896

序列问题

摆动序列

376. 摆动序列 - 力扣(LeetCode)

image-20250516170811819

**相关技巧:**首先我们先来理解题意要我们干什么,就是在一个序列中,找出其摆动序列,即其差值的形式为正负交替的,找出其最长子序列的长度。就是我们可以通过删除一些元素来使其满足摆动序列的性质,这里就是要求其最大的长度。

理解了题意再来看我们该怎么做这道题。我们通过什么样的形式来删除一些不必要的元素呢?举个例子来说,当序列为1,2,3,4时,可以很明显的看出最大长度为2,但是是哪个组合呢?1,2可以,1,3可以,1,4也可以。这里我们注意,我们以最后的作为答案。即我们一直增的话,我们就找到山顶,一直降的话我们就找到山谷,像爬山一样,找出山顶山谷的过程,这就是我们使用的贪心策略。

这里代码实现的关键就是我们怎么找到山谷山顶,其实很简单,我们所需要的摆动序列差值是正负摆动的,即两者差小于零,但是差值为零就不算摆动了,所以这样我们就能够很容易的写出代码了,如下所示。

class Solution:def wiggleMaxLength(self, nums: List[int]) -> int:if len(nums) <= 1:return len(nums)  # 如果数组长度为0或1,则返回数组长度preDiff,curDiff ,result  = 0,0,1  #题目里nums长度大于等于1,当长度为1时,其实到不了for循环里去,所以不用考虑nums长度for i in range(len(nums) - 1):curDiff = nums[i + 1] - nums[i]if curDiff * preDiff <= 0 and curDiff !=0:  #差值为0时,不算摆动result += 1preDiff = curDiff  #如果当前差值和上一个差值为一正一负时,才需要用当前差值替代上一个差值return result

单调递增的数字

738. 单调递增的数字 - 力扣(LeetCode)

image-20250516170836651

**相关技巧:**这题题目还是很好理解了,就是找到单调递增的最大数,首先我们来看看,我们该怎么去遍历这个数,如果我们从左往右进行遍历,当前数小于上一位了,修改上一位,可是修改之后呢?上一位因为修改又小于上上一位了怎么办?那我们在来看从右往左进行遍历,当前位比前一小,说明需要修改前一位,修改之后,我们再将修改位之后的都变成9,这样我们就不会破坏递增性质了。

比如说就是332,第2位的3比2大,不符合递增性质,所以,3-1变成2,修位之后都变成9,就变成了329,然后再看第1位的3比第2位的2大,所以再修改,3-1变成2,第一位的3之后的都变成9,就变成了299,一次遍历就能够得到我们需要的,代码如下。

class Solution:def monotoneIncreasingDigits(self, n: int) -> int:# 将整数转换为字符串strNum = list(str(n))# 从右往左遍历字符串for i in range(len(strNum) - 1, 0, -1):# 如果当前字符比前一个字符小,说明需要修改前一个字符if strNum[i - 1] > strNum[i]:strNum[i - 1] = str(int(strNum[i - 1]) - 1)  # 将前一个字符减1# 将修改位置后面的字符都设置为9,因为修改前一个字符可能破坏了递增性质strNum[i:] = '9' * (len(strNum) - i)# 将列表转换为字符串,并将字符串转换为整数并返回return int(''.join(strNum))

贪心解决股票问题

买卖股票的最佳时机II

122. 买卖股票的最佳时机 II - 力扣(LeetCode)

image-20250516170859647

**相关技巧:**首先我们要清楚,我们一天只能持有一支股票,并且我们一天中只有买股票和卖股票的操作。那么我们需要如何才能获得最大的利润呢?

首先一个非常重要的就是要知道,利润是可以分解的。

就是说我们假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。其本质相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。

**此时就是把利润分解为每天为单位的维度,而不是从 0 天到第 3 天整体去考虑!**那么根据 prices 可以得到每天的利润序列:(prices[i] - prices[i - 1])…(prices[1] - prices[0])。

这个时候再来看,我们需要获得最大的利润是不是就只需要将每天正的利润加起来即可。其实贪心也体现再其中,我只要赚了就卖掉,就是很典型的贪心思想了。

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

两个维度权衡问题

分发糖果

135. 分发糖果 - 力扣(LeetCode)

image-20250516170945614

**相关技巧:**首先看题,我们的第一想法肯定就是一次遍历,如果其分数比左右两边大,就取大的加1,但是这样我们同时兼顾就会造成顾此失彼的状态,比如说如下的情况

image-20250528163442809

一开始都是1个,即是1,1,1,1,1,1,1。按照我们刚才所说的同时比较两边就会得到最终的1,1,1,2,2,2,1。但是这最终得到的是不符合题意的,最高分的5应该比边上的大,但最终得到的却不是的。

所以我们取做的时候就要分维度比较讨论。首先从左往右遍历比较,并且比较的是其右边的数,然后从右往左遍历比较,并且比较的是其左边的数,最终计算糖果数量。代码如下,还是比较容易理解的。

class Solution:def candy(self, ratings: List[int]) -> int:n = len(ratings)candies = [1] * n# Forward pass: handle cases where right rating is higher than leftfor i in range(1, n):if ratings[i] > ratings[i - 1]:candies[i] = candies[i - 1] + 1# Backward pass: handle cases where left rating is higher than rightfor i in range(n - 2, -1, -1):if ratings[i] > ratings[i + 1]:candies[i] = max(candies[i], candies[i + 1] + 1)return sum(candies)

根据身高重建队列

406. 根据身高重建队列 - 力扣(LeetCode)

image-20250516171010146

**相关技巧:**同样的这回我们仍旧是需要从两个维度来进行考量。首先考虑身高,然后再考虑k,我们首先按照身高排序,然后执行插入操作,按身高先插入,再按k值进行插入,当k值相同的时候,身高矮的在前面。其实就是两次排序的过程,先按身高排,再按k值排。其实其贪心策略就如下:

局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性

全局最优:最后都做完插入操作,整个队列满足题目队列属性

实现的代码如下,这还是比较好理解的。

class Solution:def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:# 先按照h维度的身高顺序从高到低排序。确定第一个维度# lambda返回的是一个元组:当-x[0](维度h)相同时,再根据x[1](维度k)从小到大排序people.sort(key=lambda x: (-x[0], x[1]))que = []# 根据每个元素的第二个维度k,贪心算法,进行插入# people已经排序过了:同一高度时k值小的排前面。for p in people:que.insert(p[1], p)return que
http://www.dtcms.com/wzjs/126323.html

相关文章:

  • ftp网站备份如何自己开发一个平台
  • 泰达人才网招聘网抖音优化是什么意思
  • 微信 网站 收费千博企业网站管理系统
  • wordpress增加评论验证码兰州seo优化
  • 房地产网站怎么推广seo收录排名
  • 网站访问加速器贵阳百度快照优化排名
  • 青岛网站制作公司 网络服务百度正式员工工资待遇
  • 建设网站就选用什么样的公司郑州网络推广公司
  • 网站未收录百度指数分是什么
  • 郑州网站外包线上宣传方案
  • 美女直接做的网站百度经验官网登录
  • 网站找谁备案邢台市seo服务
  • 网页设计作业网站素材和效果图seo快速排名软件网址
  • 做公司网站解析百度在西安有分公司吗
  • 怎么做试玩平台推广网站网站搜索优化找哪家
  • 吴桥做网站价格推广普通话ppt课件
  • ios网页游戏培训seo去哪家机构最好
  • 游戏网站建设方案书竞价培训班
  • 做时时彩网站赚钱苏州seo关键词排名
  • 网推什么意思线下课程seo
  • 赣州网站建设需要多少钱网站建设运营
  • 股票配资网站建设seo优化服务是什么意思
  • 网站建设软件公司网站seo软件
  • 移动网站建设今天最新新闻
  • 做网站编辑工作累吗品牌运营具体做什么
  • 做一个像qq空间的网站响应式网站模板的应用
  • 网站整站模板seo快速排名软件网站
  • 网站项目策划书模板关键词推广seo怎么优化
  • 免费的wordpress模板下载seo推广优化
  • 怎么做网站的搜索功能成都seo学徒