贪心的特点就是不断求得局部最优解
然后用局部最优解求得全局最优解
55. 跳跃游戏

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

示例 1:

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

来源:力扣(LeetCode)
思路,每一个数据都有一个能跳跃的区间,如下图,当nums[0] = 2时,你可以跳一步,也可以跳两步

我们保存当前跳跃区间的末尾,然后遍历数组,找到这个区间内的能跳最远的选择,很明显,在当前区间内,从2跳到3明显是最好的选择,然后把更新end到‘3’的跳跃区间的末尾,并且再次寻找最优解,如下图红色部分

明显4是最好的选择,再次更新end,发现end已经超过了数组长度,那么我们就得到了答案:可以到达数组末尾
代码:

class Solution {public:bool canJump(vector<int>& nums) {int N = nums.size(), end = 0 , maxjump = 0;
//特殊情况,如果数组长度为1,那他一开始就在终点了,不用再进行后续判断       if(N == 1) return true;
//不用考虑最后一位,因为只要跳到最后一位就行了     for(int i = 0;i<N-1;++i){//如果当前最远距离甚至都超不过我们遍历的位置,
//就说明更加不可能跳到末尾了,直接放弃吧        if(maxjump >= i){//维护当前最远跳跃距离maxjump = max(maxjump , nums[i]+i);
//如果已经遍历到当前跳跃区间末尾,就利用最远条约距离更新end,然后判断end是否超过数组长度(下标)                if(i == end){end = maxjump;if(end >= N-1) return true;}}}
//如果没在for里边return,就说明是到达不了末尾了,返回false     return flase;}
};

同样思路解决第二题
45. 跳跃游戏 II
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
说明:
假设你总是可以到达数组的最后一个位置。
来源:力扣(LeetCode)

这题有一点点区别,题目确定了一定能达到数组末尾,然后要我们求最小跳跃次数,思路一模一样,求当前最优解,每更新一次end,就说明跳了一次

代码:

class Solution {public:int jump(vector<int>& nums) {int end = 0 , maxjump = 0, count = 0 ,N = nums.size();for(int i=0;i<N-1;i++){if(maxjump>=i){maxjump = max(nums[i]+i,maxjump);if(i == end){end = maxjump;count++;//每跳一次,就+1}}}return count;}
};

134. 加油站

在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
如果题目有解,该答案即为唯一答案。
输入数组均为非空数组,且长度相同。
输入数组中的元素均为非负数。
来源:力扣(LeetCode)
先来个暴力算法:

首先确定哪些加油站可能作为起点
gas[ i ] < cost[ i ] 时,i就不可能作为起点,首先看看cost数组的定义:开往下一个加油站要花费的汽油,而gas是在改加油站获得的汽油,如果gas[ i ] < cost[ i ]就代表改变到达不了下一个加油站,所以不能做起点、

再说说算法的思路
我们从每一个可能作为起点的加油站出发,用gassum记录当前的汽油剩余值,一旦gassum < 0,就代表这个点也没救了,这时就从下一个可能的点出发,
一旦走完了一圈且没有跳出,就说明这个点可行,直接返回
而如果所有可能的点都走过了还没有返回,就说明不不管从哪个点出发都走不完一圈,return -1;

代码:

class Solution {public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int N = gas.size();for(int i = 0;i<N;++i){int gassum = gas[i]-cost[i];int idx = (i+1)%N;if(gassum>=0){while(idx != i){gassum += gas[idx]-cost[idx];if(gassum <0) break;idx = (idx+1)%N;}if(idx == i) return i;}}return -1;}
};

贪心:

思路:
用gassum记录出发点到当前站点时得汽油剩余量,如果剩余量 < 0就说明刚开始选的那个出发点不行,就把当前站点的下一个站点作为新的出发点,并清零gassum,重新计数,> 0的话就不管,让保持出发点不变,因为根据gassum来看,这个出发点暂时还是可靠的,不管他就行了,但是其实我对这个结论还是不清不楚的,只知道这个结论确实是对的

同时,我们用一个Sum更新总的gas - cost 如果 Sum > 0,就说明这一圈还是有希望的,如果Sum < 0,就说明没希望了,怎么走都走不完一圈

class Solution {public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int gassum = 0;//当前汽油int Sum = 0;//总汽油int idx = 0;//出发点for(int i = 0;i<gas.size();++i){gassum += gas[i]-cost[i];Sum += gas[i]-cost[i];if(gassum < 0){//一旦 < 0,就更新出发点,并清零gassumidx = i+1;gassum = 0;}}if(Sum < 0) return -1;//如果总汽油 < 0,就说明没救了else return idx;//不然就返回出发点}
};

122. 买卖股票的最佳时机 II

给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: prices = [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

来源:力扣(LeetCode)
思路:

贪心算法是把全局收获分开成每天的收获来看了

假设每天都进行买入卖出的情况下,我们只选择能获利的那天进行卖出,这样一直下去最终我们的获利就是最高的,
但是注意:
这种思维不能用于只进行一次买卖的情况,因为一次选择并不能获得真正的最大利润,如下图,稍微复杂一点的情况两者就不一样了,而这一题并没有要求只能选择一次

贪心算法的结果是正确的,但是它并没有模拟股票的买卖过程,要真正的过程,还是得用动态规划

leetcode学习记录_贪心相关推荐

  1. leetcode学习记录_二叉树_树

    二叉搜索树(二叉排序树.二叉查找树) 二叉树值一种特殊的二叉树,它要么是空树,要么满足以下条件: 若左子树存在,则左子树上的所有结点都一定小于根结点,反之,右子树的所有结点都一定大于根节点,并且除了根 ...

  2. leetcode学习记录_罗马数字

    13. 罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 ...

  3. leetcode学习记录5——53.最大子序和

    leetcode学习记录 leetcode学习记录五 最大子序和 解题思路 代码 leetcode学习记录五 最大子序和 难度:简单 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数 ...

  4. 【拉扎维书中的电路仿真学习记录_未完待续】

    [拉扎维书中的电路仿真学习记录] 第四章 1. 简单的差动电路 2 习题4_4 第四章 1. 简单的差动电路 1.p32, 图4.6,简单的差动电路 2.ADE设置 3.输入输出波形 Vin1 与 V ...

  5. 学习记录_美术部分_美术理论基础

    目录 1.光影 2-透视 3.色彩 4.构图 5.镜头语言 6.游戏概念设计 一.光影 光影定义 黑白灰与明暗五大调子 游戏中的光影 利用或者增强阴影效果,来增加体感,使物体通透 光影的黑白灰变化对氛 ...

  6. 西瓜书学习记录_绪言

    系列文章目录 文章目录 系列文章目录 前言 一.知识回顾 二.课后习题思考 1.3 总结 前言 该系列文章主要用于记录笔者在大三下学期的西瓜书学习过程 本文讨论西瓜书绪言中的学习体会以及对某些问题的思 ...

  7. 学习记录_检验和的一般求法

    初次学习网络协议记录,如有错误请见谅,欢迎大家补充修改哈. 1.先将首部内的检验和设置为全0: 2.依据协议类型拿到那些用于计算检验和的字段排序和对应的值: 3.按照排序,进行每16个bit作为一个整 ...

  8. leetcode学习记录-罗马数字转整数

    题目 13.罗马数字转整数 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, ...

  9. PHP学习记录_基本语法

    1.在PHP中,输出的字符串可以用双引号作分隔符,也可用单引号作分隔符.如果用双引号作分隔符,则字符串中的变量可以自动被替换成变量的值(这是其他程序设计语言所不具备的功能).如果用单引号作分隔符,则不 ...

最新文章

  1. 【编程开发】Python隐藏属性——使用双下划线标识私有属性,外部不可直接访问...
  2. 后端开发开发mac装机和开发环境指南(新手版)
  3. matlab条形图添加误差线_在Excel图表中添加误差线和对误差线进行设置的技巧
  4. gzip+chunked页面分段输出,resin gzip trunked无效,页面数据写入自定义buffer
  5. java 定时任务spring_Spring定时任务(一):SpringTask使用
  6. safe-rm替换系统的rm
  7. python 嵌套型partials(nested partials)的使用
  8. Linux 管理员技术
  9. leetcode954. Array of Doubled Pairs
  10. 无盘服务器秒卡 锐起0359,锐起无盘系统问题汇集
  11. 怎么使用小爱同学音响_小爱同学怎么用
  12. FreeRADIUS介绍
  13. python桌面程序自动化教程_桌面应用自动化python
  14. office表格怎么冻结前两行_office 2010下excel表格中冻结功能操作任意行的技巧
  15. 使用spring validation完成数据后端校验-自定义校验的注解-判断是否为空
  16. 数学三次方的计算机符号,数学符号三次方
  17. Axure chrome插件安装
  18. Canal Java 入门与使用
  19. 主成分回归的r语言代码
  20. JVM中的cms是什么???

热门文章

  1. Very Deep Convolutional Networks for Large-Scale Image Recognition—中英文对照
  2. linux下dd工具,dd 工具使用
  3. 深度学习还没入门?看看深度学习三巨头的Deep Learning综述(4)
  4. 【IoT】从马斯克造火箭到产品开发,快速失败很重要
  5. 加速 SpringBoot 应用开发,官方热部署神器真带劲
  6. 老外眼里的中式英语PK标准英语
  7. 2021会宁三中高考成绩查询,2019中考分数线
  8. 小样本点云深度学习库_基于点云深度学习的点云数据集制作系统及方法与流程...
  9. 【AAD Connect】01:AAD Connect把本地AD账户同步到Office365(AD域账户迁移)
  10. 计算机毕业设计Java-ssm爱心扶贫超市管理系统源码+系统+数据库+lw文档