| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 贪心算法每日一题(0) -> 正文阅读 |
|
[数据结构与算法]贪心算法每日一题(0) |
目录 一、前言什么是贪心算法?
贪心的本质是从局部最优取到全局最优的过程 就好比我们要我从三国中挑选十个武将陪我征战四方 那我们每次挑选肯定是想条武力最猛的一个 从而达到全局的最猛的十个人 其次我想说,经过这两天贪心算法的刷题,总结出来ta其实没有固定的套路 就是不断尝试从局部最优到全局最优的过程 而且贪心算法的尝试往往嵌套一些技巧(比如数组边界的限制) 所以唯一的难点就是如何通过局部最优,推出整体最优。 那么如何能看出局部最优是否能推出整体最优呢?有没有什么固定策略或者套路呢? 不好意思,也没有!?靠自己手动模拟,如果模拟可行,就可以试一试贪心策略,如果不可行,可能需要动态规划。 如何验证可不可以用贪心算法呢? 最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧。 贪心算法一般分为如下四步:
二、正题
1、暴力解法;暴力的方法很明显就是O(n^2)的,遍历每一个加油站为起点的情况,模拟一圈。 如果跑了一圈,中途没有断油,而且最后油量大于等于0,说明这个起点是ok的。 暴力的方法思路比较简单,但代码写起来也不是很容易,关键是要模拟跑一圈的过程。 for循环适合模拟从头到尾的遍历,而while循环适合模拟环形遍历,要善于使用while!
2、贪心算法:可以换一个思路,首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。 每个加油站的剩余量rest[i]为gas[i] - cost[i]。 i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,起始位置从i+1算起,再从0计算curSum。(题解来源:代码随想录) ? ?那么为什么一旦[i,j] 区间和为负数,起始位置就可以是j+1呢,j+1后面就不会出现更大的负数? 如果出现更大的负数,就是更新j,那么起始位置又变成新的j+1了。 而且j之前出现了多少负数,j后面就会出现多少正数,因为耗油总和是大于零的(前提我们已经确定了一定可以跑完全程)。 那么局部最优:当前累加rest[j]的和curSum一旦小于0,起始位置至少要是j+1,因为从j开始一定不行。全局最优:找到可以跑一圈的起始位置。 代码如下:
3、图解贪心
下图的 为了让 ?这个图是从0点(i=0,即第一个站)出发的折线图,那么改变出发点时,这个图会怎么变化呢?你可以自己去画一画,你会发现,整体折线图的形状是没有变的,改变的是y值,相当于将折线图在Y轴方向上上下平移。那么,当最小点落在X轴上时(也就是使得最小点y=0时),整体折线在X轴上方,y值恒大于等于0,也就是剩余油量一直不为负,可以绕行一圈。对于本例,也就是使得i=3时,y=0。此时,意味着从i=3,第四个站出发,到此站时即没有加油也没有耗油,剩余油量为0。代码如下:
这道题其实对初入贪心的同学来说还是有点难度的 但它确实是一道很巧妙的贪心题目。最后送给大家一句话,也是这道题的核心。 ?如果结局是好的,痛苦积累最多的那天过后,生活会开始好起来的,纵使再遇苦难,总有美好的事可以抵消苦难. |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 11:30:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |