贪心算法基础及leetcode例题
理论
本质:找到每个阶段的局部最优,然后去推导得到全局最优
两个极端:常识&&很难:
很多同学通过了贪心的题目,但都不知道自己用了贪心算法,因为贪心有时候就是常识性的推导,所以会认为本应该就这么做!
套路:
贪心没有套路,说白了就是常识性推导加上举反例
做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。
贪心算法一般分为如下四步:
将问题分解为若干个子问题
找出适合的贪心策略
求解每一个子问题的最优解
将局部最优解堆叠成全局最优解
这个四步其实过于理论化了,我们平时在做贪心类的题目 很难去按照这四步去思考,真是有点“鸡肋”。
Leetcode题目
简单题
455.分发饼干
思路:大饼干 喂 胃口大的kid,才能充分利用

class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int j=s.length-1;
int sum = 0;
for(int i=g.length-1;i>=0;i--){
if(j>=0 && s[j]>=g[i]){
sum++;
j--;
}
}
return sum;
}
}
中等题
序列问题---376. 摆动序列
思路:考虑情况

记录摆动条件:
prediff>0 && curdiff<0
或者 prediff<0 && curdiff>0
情况1:上下坡中有平坡

在图中,当i指向第一个2的时候,prediff > 0 && curdiff = 0 ,当 i 指向最后一个2的时候 prediff = 0 && curdiff < 0。
如果我们采用,删左面三个2的规则,那么 当 prediff = 0 && curdiff < 0 也要记录一个峰值。
综合到上述:记录条件【prediff>=0 && curdiff<0 或 prediff=<0 && curdiff>0】
情况2:首尾两端

result初始为1(默认最右面有一个峰值),
curDiff > 0 && preDiff <= 0,那么result++(计算了左面的峰值),最后得到的result就是2(峰值个数为2即摆动序列长度为2)
做法:初始化prediff=0
情况3:单调有平坡

只需要在 这个坡度 摆动变化的时候,更新prediff就行,这样prediff在 单调区间有平坡的时候 就不会发生变化
做法:调整prediff更新位置
java实现
class Solution {
public int wiggleMaxLength(int[] nums) {
int prediff = 0;//考虑只有两个元素的时候,默认为0;为头元素制造一个平坡
int curdiff = 0;
int result = 1;//默认最右端有坡度
//一个元素的时候
if(nums.length == 0) return result;
for(int i=0;i<nums.length-1;i++){//nums.length-1 因为最右端已经记录了
curdiff = nums[i+1] - nums[i];
if((prediff>=0 && curdiff <0) || (prediff<=0 && curdiff >0)){
result++;
prediff = curdiff;
}
//prediff = curdiff;
}
return result;
}
}
股票问题---122. 买卖股票的最佳时机 II
只有一只股票!当前只有买股票或者卖股票的操作
关键点:想到其实最终利润是可以分解的:每天的利润
贪心:只收集每次的正利润

其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间。
java
class Solution {
public int maxProfit(int[] prices) {
int sum = 0;
for(int i=0;i < prices.length-1;i++){
if((prices[i+1] - prices[i])>= 0){
sum += prices[i+1] - prices[i];
}
}
return sum;
}
}
两个维度权衡问题---135. 分发糖果
关键点:两边分别考虑
先确定 右边比左边高的情况;然后再确定 左边比右边高的情况
class Solution {
public int candy(int[] ratings) {
int sum = 0;
int len = ratings.length;
int[] candy = new int[len];
candy[0]=1;
for(int i=1;i<len;i++){
if(ratings[i] > ratings[i-1]){
candy[i] = candy[i-1] +1;
}else{
candy[i] =1;
}
}
for(int i=len-2;i>=0;i--){
if(ratings[i] > ratings[i+1]){
candy[i] = Math.max(candy[i+1] +1,candy[i]);
}
}
for(int i=0;i<len;i++){
sum += candy[i];
}
return sum;
}
}
贪心算法基础及leetcode例题的更多相关文章
- LEETCODE —— Best Time to Buy and Sell Stock II [贪心算法]
Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...
- Algorithm - 贪心算法使用场景 ( LEETCODE —— Best Time to Buy and Sell Stock II)
先看一道leetcode题: Best Time to Buy and Sell Stock II Say you have an array for which the ith element is ...
- C#LeetCode刷题-贪心算法
贪心算法篇 # 题名 刷题 通过率 难度 44 通配符匹配 17.8% 困难 45 跳跃游戏 II 25.5% 困难 55 跳跃游戏 30.6% 中等 122 买卖股票的最佳时机 II C ...
- LeetCode解题记录(贪心算法)(二)
1. 前言 由于后面还有很多题型要写,贪心算法目前可能就到此为止了,上一篇博客的地址为 LeetCode解题记录(贪心算法)(一) 下面正式开始我们的刷题之旅 2. 贪心 763. 划分字母区间(中等 ...
- 【ybtoj】贪心算法例题
[基础算法]第二章 贪心算法 例一 奶牛晒衣服 题目描述 有n件衣服,第i件衣服的湿度为h. 在自然条件下,每件衣服每分钟都可以自然晒干A点湿度. 在烘干机作用下,可以选择一件衣服,用一分钟的时间晒干 ...
- LeetCode算法训练-贪心算法 455.分发饼干 376. 摆动序列 53. 最大子序和
欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练-贪心算法 455.分发饼干 376. 摆动序列 53. 最大子序和 前置知识 贪心算法核心是找局部最优解,通过局部最优推导出全局最优 Lee ...
- leetcode 贪心算法
贪心算法中,是以自顶向下的方式使用最优子结构,贪心算法会先做选择,在当时看起来是最优的选择,然后再求解一个结果的子问题. 贪心算法是使所做的选择看起来都是当前最佳的,期望通过所做的局部最优选择来产生一 ...
- Leetcode题目55.跳跃游戏(贪心算法-中等)
题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: ...
- 【Leetcode】买卖股票-贪心算法
题目: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必 ...
- 【算法】数据结构与算法基础总览(中)——刷Leetcode等算法题时一些很实用的jdk辅助方法锦集
最近重新学习数据结构与算法以及刷leetcode算法题时,发现不少jdk自带的方法可以提升刷题的效率.这些小技巧不仅仅对刷算法题带来便利,对我们平时开发也是很有帮助的.本文以java语言为基础,记录了 ...
随机推荐
- vue-print-nb的应用
1.cnpm i vue-print-nb 2.触发事件:v-print="printObj" 3.触发的是个对象: printObj:{ id: ...
- SpringCloud微服务实战——搭建企业级开发框架(五十一):微服务安全加固—自定义Gateway拦截器实现防止SQL注入/XSS攻击
SQL注入是常见的系统安全问题之一,用户通过特定方式向系统发送SQL脚本,可直接自定义操作系统数据库,如果系统没有对SQL注入进行拦截,那么用户甚至可以直接对数据库进行增删改查等操作. XSS ...
- 使用python-gitlab获取本地gitlab仓库project信息的方法
代码中有注释,直接看代码 #coding:utf8 #!/usr/bin/env python #@author: 9527 import gitlab import openpyxl import ...
- [数据库/Linux]CentOS7安装MySQL Percona版(RPM方式)
OS: CentOS7 (x86_64) MySQL: MySQL Percona 5.7.31-34 0 前置条件 已配置完成YUM源 已卸载先前可能安装的MySQL rpm -qa | grep ...
- 迁移学习(SPI)《Semi-Supervised Domain Adaptation by Similarity based Pseudo-label Injection》
论文信息 论文标题:Semi-Supervised Domain Adaptation by Similarity based Pseudo-label Injection论文作者:Abhay Raw ...
- FTP FileZilla 425 Can't open data connection for transfer of "/" 错误: 读取目录列表失败
如图所示: 在谷歌百度搜了很多资料都没有解决,主动被动模式端口入站规则什么能设置的都设置了结果还是不行,尝试换了一个软件用了FTP Rush就直接可以连上了. 具体原因有空再查找吧,目前问题算是解决了 ...
- React+Antd在使用form表单提交DatePicker日期框的时候会出现少八小时的情况
在使用antd做form表单提交的时候,突然发现了一个很有意思的bug.就是在使用datepicker组件日期框的时候会出现提交后少一天的问题 我在网上搜索了许多解决办法,也是困扰了我一天的时间,下面 ...
- [GAUSS-50201]:The /opt/software/openGauss/xxxx-RedHat-64bit.tar.bz2 does not exist
问题描述:使用redhat7.9来安装opengauss集群,预安装过不去.opengauss官方只支持centos版本,最好是centos7.6. [root@db01 script]# ./gs_ ...
- AutoGPT目前只是成功学大师GPT版
一大波韭菜被收割了 最近很多人在交流对于AutoGPT的震惊和激动.AutoGPT是一个开源的应用程序,展示了GPT-4语言模型的能力.这个程序由GPT-4驱动,自主地开发和管理业务,以增加净值.它是 ...
- 【Lua】VSCode 搭建 Lua 开发环境
前言 最近在找工作,基本所有的岗位都会问到 Lua(甚至拼 UI 的都要求会 Lua),咱能怎么办呢,咱也只能学啊-- 工欲善其事,必先利其器.第一步,先来把环境配置好吧! 当前适用版本: LuaBi ...