Leetcode题解-贪心算法 - MaggicQ的博客
时间:2019-10-17
本文章向大家介绍Leetcode题解-贪心算法 - MaggicQ的博客,主要包括Leetcode题解-贪心算法 - MaggicQ的博客使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文目录
定义
贪心算法(英语:greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。
贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。
贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。
常见题型
买卖股票的最佳时机
class Solution:
def maxProfit(self, prices: List[int]) -> int:
res, in_price = 0, float('inf')
for price in prices:
in_price = min(in_price, price)
res = max(res, price-in_price)
return res
买卖股票的最佳时机 II
(可以参与多次交易)
class Solution:
def maxProfit(self, prices: List[int]) -> int:
res = 0
for i in range(len(prices)-1):
res += max(0, prices[i+1]-prices[i])
return res
跳跃游戏
class Solution 大专栏 Leetcode题解-贪心算法 - MaggicQ的博客:
def canJump(self, nums: List[int]) -> bool:
max_ind = 0
for i, n in enumerate(nums):
if i > max_ind: # 超出当前所能到达的最远索引
return False
# max_ind每一步都会更新
# 表示当前所能到达的最远的索引
max_ind = max(max_ind, i+n)
# 成功完成遍历,说明从第一个位置出发能到达最后一个位置
return True
最大子序和
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
for i in range(1, len(nums)):
if nums[i-1] > 0:
nums[i] += nums[i-1]
return max(nums)
判断子序列
class Solution:
def isSubsequence(self, s: str, t: str) -> bool:
if not s:
return True
pos = t.find(s[0])
if pos == -1:
return False
else:
return self.isSubsequence(s[1:], t[pos+1:])
原文地址:https://www.cnblogs.com/sanxiandoupi/p/11692055.html
- PHP7新特性介绍
- VFS四大对象之四-struct file
- 《Redis设计与实现》读书笔记(二) ——Redis中的字典(Hash)
- 《Redis设计与实现》读书笔记(三) ——Redis中的链表
- 《Redis设计与实现》读书笔记(四) ——Redis中的跳跃表
- 解析Linux中的VFS文件系统之文件系统的注册(二)
- vivi虚拟摄像头驱动程序
- 系统架构 | 基于微服务架构,改造企业核心系统之实践
- 《Redis设计与实现》读书笔记(五) ——Redis中的整数集合
- 《Redis设计与实现》读书笔记(七) ——Redis对象综述及字符串对象实现原理
- 自动登录脚本
- 极致之处,精彩无限 - 优化了一半的SQL
- 编程修炼 | Scala中Stream的应用场景及其实现原理
- Linux之内存描述符mm_struct
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 你的函数有多快?使用 performance 监控前端性能
- spring security 密码过期强制修改密码
- Spring Boot入门系列(十五) SpringBoot开发环境热部署的配置
- idea启用springboot项目热部署
- 【LeetCode每日一题】22. Generate Parentheses
- Apache的三种工作模式
- 一个Activity向另外一个Activity传递值的方法
- 活动被系统回收,临时数据的保存方法
- C语言入门系列之5.循环控制结构程序
- 知晓当前在哪一个活动
- 一键退出程序
- C语言入门系列之7.函数的定义、参数、调用和存储类别
- Python Django开发 异常及其解决办法(二)
- C#参数类型总结
- C++ stringstream 实现字符与数字之间的转换