贪心算法(局部最优实现全局最优)第二篇

贪心算法(局部最优实现全局最优)第二篇

目录

1. LeetCode376. 摆动序列

2. LeetCode334. 递增的三元子序列

3. LeetCode674. 最长连续递增序列

4. LeetCode121. 买卖股票的最佳时机


今天我们继续来聊聊贪心算法,因为我在前面也说过贪心算法最重要的就是经验,所以我们今天继续通过刷题的方式来学习贪心算法。

1. LeetCode376. 摆动序列

这道题的意思其实也比较好理解的,就是求一个最长的摆动序列,可以从原数组中删除不符合条件的数。

这道题的话我们先来聊一下思路,因为要求的是最长的子数组。根据题目要求那么是不是说我们每次选的数字都要在有限的分为里面做到尽可能的大或者尽可能的小。为什么要这么做呢?是因为但我们选到最值的时候我们在后面的选择中才可以有更多的选择。

我们看下面这个图,里面有abcdef这几个极值点。我们看,在c和d之间有一个点x1,假设我们在这里选择了这个点的话,那么后面的数都选不了了,因为接下来是要选择比x1小的数。这也是为什么我们每一次都要选择最值的原因。

那么我们代码该怎么设计呢?我们就可以试用一个三指针,通过比较的这三个指针的大小的方式来确定极值点的位置。或者我们也可以观察一下下面这张图,以b点为例子,我们通过后面的点减去前面的点的方式,b减去ab上面的点都是正数,而bc上面的点减去b都是负数,而如果是一个非极值点的话,则都是正数,通过这样的方式我们就得到了极值点,接下来我们就使用这个方式来编写代码。

我们看下面这个代码,前面两个if条件判断都是用来特判的。同时因为原数组里面的值是可能连续好几个相同的,所以我们在这里是需要if判断的,如果相同那么就直接跳过。最后的答案之所以需要+2也是因为我们在这样判断的时候是没有加上两边的端点的,所以我们在这里需要加上。

class Solution { public: int wiggleMaxLength(vector<int>& nums) { int left=0; int right=0; int sz=nums.size(); int ret=0; if(sz==1||(sz==2&&(nums[0]==nums[1]))) return 1; if((nums[0]==nums[sz-1])&&(nums[0]==nums[sz/2])) return 1; for(int i=0;i<sz-1;++i) { right=nums[i+1]-nums[i]; if(!right) continue; if((left*right)<0) { ret++; } left=right; } return ret+2; } };

2. LeetCode334. 递增的三元子序列

这道题的话就比较简单,就是要求我们判断原数组里面有没有三个数是呈现递增关系的,有的话就返回true,没有的话就返回false。

这道题的思路其实挺好想到的,就是在代码编写的时候不要写错了就好。这道题的解法有点像我上面说的三指针。简单来说就是几个判断就好了。

可是这道题使用到了贪心吗?答案是Yes。因为我们的代码有一个思想,那就是每一次判断都在进行筛选,我们都在尽可能的让a和b变小,这样方便我们找到合适的点。

class Solution { public: bool increasingTriplet(vector<int>& nums) { int a=nums[0]; int b=INT_MAX; int sz=nums.size(); for(int i=1;i<sz;++i) { if(nums[i]>b) return true; if(a>nums[i]) a=nums[i]; else if(nums[i]!=a) b=nums[i]; else continue; } return false; } };

3. LeetCode674. 最长连续递增序列

这道题的话比较简单,就是叫我们从原数组里面找到最长的递增子数组,同时要求是连续的。

这道题的话就比较简单了,就是从头到尾遍历一遍就好,同时记录最大的ret就可以了。

class Solution { public: int findLengthOfLCIS(vector<int>& nums) { int ret=1; int ret1=1; int sz=nums.size(); for(int i=0;i<sz-1;++i) { if(nums[i+1]>nums[i]) ret1++; else ret1=1; if(ret1>ret) ret=ret1; } return ret; } };

4. LeetCode121. 买卖股票的最佳时机

这道题的话也是比较简单的,就是要求我们在原数组里面找到两数之差最大的那两个数。

所以说这道题的话我们就是通过一次遍历然后同时用一个l来不断更新最小值,这样我们就可以取到最大的数了。

这道题贪心的地方在于l一直在更新,在不断地变小。

class Solution { public: int maxProfit(vector<int>& p) { int sz=p.size(); int ret=0; int ret1=0; int l=INT_MAX;//买 for(int i=0;i<sz;++i) { if(l<p[i]) ret=max(ret,p[i]-l); if(l>p[i]) l=p[i]; } return ret; } };

Read more

程序员怎样才能学好算法?这本书送几本给大家!

程序员怎样才能学好算法?这本书送几本给大家!

文章目录 * 前言 * 一、笔者对算法的理解 * 二、写书的初衷及过程 * 三、主要内容 * 四、本书的内容 * 五、联合推荐 * 六、购买方式 * 七、《算法秘籍》 * 中奖者名单 前言 提示:这里可以添加本文要记录的大概内容: 数据结构和算法是计算机科学的基石,是计算机的灵魂,要想成为计算机专业人员,学习和掌握算法是十分必要的。不懂数据结构和算法的人不可能写出效率更高的代码。计算机科学的很多新行业都离不开数据结构和算法作为基石,比如大数据、人工智能等。底层开发中也需要使用非常多的数据结构和算法知识,以保证底层系统的稳定性和高效性。 提示:以下是本篇文章正文内容,下面案例可供参考 一、笔者对算法的理解 计算机科学家尼古拉斯·沃斯在计算机领域有一句人尽皆知的名言: “算法+数据结构=程序”(Algorithms+Data Structures=Programs) 所以数据结构和算法是程序员必须掌握的技能。尤其是到一些大公司面试的时候,算法更是一个少不了的环节,熟练掌握数据结构和算法,可以开拓我们的视野,提高我们的逻辑思维能力,

By Ne0inhk
【动态规划】【斐波那契数列模型】三步问题、第N个泰波那契数、使用最小花费爬楼梯

【动态规划】【斐波那契数列模型】三步问题、第N个泰波那契数、使用最小花费爬楼梯

文章目录 * 模板 * 算法原理 * 代码编写 * 1. 第 N 个泰波那契数 * 题目解析 * 算法思路 * 代码编写 * 空间优化 * 2. 三步问题 * 题目解析 * 算法原理 * 代码编写 * 3 . 使用最小花费爬楼梯 * 题目解析 * 算法原理 * 解法一 * 解法二 * 代码编写 模板 算法原理 * 做动态规划的题目,一般会先创建一个一维数组 dp,称之为 dp表 * 我们想办法填满这个 dp表,里面的某个值就是最终结果 采用动态规划,一般分五步: 1. 状态表示 1. 是什么? * dp 表中每一个值所表示的含义就是状态表示(通俗解释) 2. 怎么来?(非常重要) * 题目要求 * 经验+题目要求(多做题)

By Ne0inhk
【动态规划】陶然无喜亦无忧,人生且自由 - 简单多状态模型

【动态规划】陶然无喜亦无忧,人生且自由 - 简单多状态模型

本篇博客给大家带来的是简单多状态之动态规划解法技巧. 🐎文章专栏: 动态规划 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 * 要开心 * 要快乐 * 顺便进步 * * * * 1. 按摩师 * 2. 打家劫舍 * 3. 删除并获得点数 * 4. 粉刷房子 * * * 要开心 要快乐 顺便进步 1. 按摩师 题目链接:面试题 17.16. 按摩师 题目内容: 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。 注意:本题相对原题稍作改动 示例 1: 输入: [1,

By Ne0inhk
【优选算法必刷100题】第038题(位运算):消失的两个数字

【优选算法必刷100题】第038题(位运算):消失的两个数字

🔥个人主页:Cx330🌸 ❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》 《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔 🌟心向往之行必能至 🎥Cx330🌸的简介: 目录 前言: 38. 消失的两个数字 算法原理(位运算): 思路: 位运算解法代码(C++): 代码一:位图 代码二:异或 博主手记(字体还请见谅哈): 总结: 前言: 聚焦算法题实战,系统讲解三大核心板块:“精准定位最优解”——优选算法,“简化逻辑表达,系统性探索与剪枝优化”——递归与回溯,“以局部最优换全局高效”——贪心算法,讲解思路与代码实现,帮助大家快速提升代码能力 位运算专题 38. 消失的两个数字 题目链接: 面试题 17.19. 消失的两个数字

By Ne0inhk