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

网站搭建服务上海建设工程检测行业协会

网站搭建服务,上海建设工程检测行业协会,生产企业网站欣赏,100个农村电商平台代码随想录算法训练营 —day27 文章目录 代码随想录算法训练营前言一、贪心算法理论基础二、455.分发饼干三、376. 摆动序列53. 最大子数组和总结 前言 今天是算法营的第27天,希望自己能够坚持下来! 今日任务: ● 贪心算法理论基础 ● 455.…

代码随想录算法训练营

—day27

文章目录

  • 代码随想录算法训练营
  • 前言
  • 一、贪心算法理论基础
  • 二、455.分发饼干
  • 三、376. 摆动序列
  • 53. 最大子数组和
  • 总结


前言

今天是算法营的第27天,希望自己能够坚持下来!
今日任务:
● 贪心算法理论基础
● 455.分发饼干
● 376. 摆动序列
● 53. 最大子序和


一、贪心算法理论基础

文章讲解
视频讲解

题目大纲:
在这里插入图片描述

贪心的本质是选择每一阶段的局部最优,从而达到全局最优。
贪心没有套路,说白了就是常识性推导加上举反例。贪心的题目要么很简单,要么没做过就想不出来思路。遇到没思路的题目不要想太久,马上看题解积累思路。


二、455.分发饼干

题目链接
文章讲解
视频讲解

思路:

  1. 这里的局部最优是,尽量用大的饼干去满足大的胃口(或者反过来用小的饼干满足小的胃口)
  2. 先对饼干和胃口排序
  3. 从后往前遍历胃口,优先用最大的饼干去匹配大胃口
  4. 如果满足的话则饼干index往前(这里要注意index>=0),累加计数。

代码如下:

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {//先排列,升序sort(g.begin(), g.end());sort(s.begin(), s.end());int index = s.size() - 1;int result = 0;for (int i = g.size() - 1; i >= 0; i--) { //遍历胃口if (index >= 0 && s[index] >= g[i]) { //遍历饼干,用最大的饼干匹配index--;result++;}}return result;}
};

三、376. 摆动序列

题目链接
文章讲解
视频讲解

在这里插入图片描述
局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值(头和尾)。

整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列。

因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了

思路:

  1. 用当前元素分别和前一元素,后一元素的差的正负来判断是否有摆动;
  2. preDiff = nums[i + 1] - nums[i],curDiff = nums[i] - nums[i - 1];
  3. preDiff和curDiff一正一负时说明出现了摆动。

这是我们思考本题的一个大体思路,但本题要考虑三种情况:
情况一:上下坡中有平坡
在这里插入图片描述
平坡有4个2,那么考虑删掉左边3个2的话,遍历到最后一个2时的条件就是prediff = 0 && curdiff < 0,所以判断峰值的条件就应该是:
(preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)

情况二:数组首尾两端
在这里插入图片描述
题目中说了,如果只有两个不同的元素,那摆动序列也是 2。
那么为了统计到这种情况,默认最右端是一个摆动,result初始化为1,且遍历只遍历到倒数第二个,i < nums.size() - 1;再加上情况一讨论的判断条件 curDiff > 0 && preDiff <= 0,那么result++,就会得到答案2.

情况三:单调坡中有平坡
在这里插入图片描述
为了避免nums[1]和nums[2]都各自统计了一次摆动,只需要在这个坡度摆动变化的时候,更新 prediff 就行(也就是图上的1),这样 prediff 在 单调区间有平坡的时候 就不会发生变化,造成我们的误判。

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() <= 1) return nums.size();int preDiff = 0; //nums[i + 1] - nums[i]int curDiff = 0; //nums[i] - nums[i - 1]int result = 1; //默认最右边有一个峰值//只遍历到倒数第二个,因为最右边一个已经算成一个峰值了for (int i = 0; i < nums.size() - 1; i ++) {curDiff = nums[i + 1] - nums[i];//出现峰值if ((preDiff <= 0 && curDiff > 0) || (preDiff>= 0 && curDiff < 0)) {result++;preDiff = curDiff; //当遇到摆动变化时才更新prediff}}return result;}
};

53. 最大子数组和

题目链接
文章讲解
视频讲解

思路:

  1. 当累加和是负数时,继续往后加都是让后面的数更加小
  2. 所以当累加和为负时,舍弃掉当前的累加,重新从下一个元素开始累加,并且在过程中记录累加的最大值。

代码如下:

class Solution {
public:int maxSubArray(vector<int>& nums) {int result = INT_MIN;int count = 0;for (int i = 0; i < nums.size(); i ++) {count += nums[i]; //计算累加值if (count > result) result = count; //记录最大值if (count < 0) count = 0; //当连续和为负数时,舍弃累加值,重新累加}return result;}
};

总结

今天第一天的贪心算法,代码其实都不难,难的是思路,需要多积累一些解题思路才行。

明天继续加油!

http://www.yayakq.cn/news/479414/

相关文章:

  • 行业门户网站的优化怎么做yps行业门户系统住房和建设执业资格注册中心网站
  • 东莞网站平台后缀商城网站开发多少钱
  • 做网站是通过怎么挣钱在线网站建设培训
  • 网站服务器配置参考指南网站备案用户名忘了怎么办
  • 有什么兼职做设计的网站做gif网站
  • 夸克破解可看禁用网站网站设计主题有哪些
  • 有美元进账去外管局网站做啥网站建设分为哪几个阶段
  • 做网站后端语言用什么有口碑的郑州网站建设
  • 上海企业建站咨询高校网站群建设
  • 建站上市公司河北邢台手机网站建设
  • 济南网站建设优化百家号全球网站排行榜
  • 北京市保障房建设官方网站中小型网站建设机构
  • 旅游主题网站怎么做网站连接到wordpress
  • cdn网站加速原理看电视剧免费的网站
  • 扬州建设工程招聘信息网站设计软件有几种
  • 局网站建设申请wordpress 读取pdf
  • 网站开发组合网站备案号要怎么查询
  • 毕设做网站可以用模板吗房产交易网
  • 建站小二字母logo设计网站
  • 网络优化app南通优化网站公司
  • 全国城市雕塑建设官方网站临沂市建设局兰山区网站
  • jsp做电影网站凡科做的网站提示证书错误
  • 郑州网站设计 品牌 视觉网站建设工作室图片
  • 湖北做网站的公司网站开发技术实验报告
  • 电商在线设计网站二维码制作app
  • 北京建站公司哪家好开通小程序流程
  • 虚拟主机网站建设的几个步骤网站搜索框如何做
  • 网红网站建设搞定设计网站做的图怎么下载不了
  • 做外贸 上国外网站三亚网红打卡景点
  • 做网站还得买域名吗标志vi设计机构