力扣100题——贪心算法

devtools/2024/9/20 8:58:27/ 标签: leetcode, 贪心算法, 算法

概述

算法>贪心算法(Greedy Algorithm)是一种在解决问题时,按照某种标准在每一步都选择当前最优解(局部最优解)的算法。它期望通过一系列局部最优解的选择,最终能够得到全局最优解。

算法>贪心算法的核心思想

算法>贪心算法的核心思想是每一步都采取最优选择,即所谓的“贪心选择”。算法会根据某种贪心策略,逐步做出局部最优的选择,并希望通过这些局部最优的选择能够得到最终的全局最优解。

算法>贪心算法的一般步骤

  1. 问题分解:将问题分解为若干个子问题。
  2. 选择贪心策略:为每个子问题选取局部最优解(通常是通过某种评价标准,选择当前最有利的选择)。
  3. 合并子问题的解:将每次的选择累积起来,直到解决完所有子问题,得到最终的全局解。

算法>贪心算法的应用场景

算法>贪心算法适用于那些通过选择局部最优解,最终能够得到全局最优解的问题。一般来说,算法>贪心算法并不总是能找到全局最优解,但在某些特定问题中,它可以得到最优解。常见的算法>贪心算法应用场景包括:

  1. 最小生成树问题:Kruskal 和 Prim 算法都是基于贪心策略的,能够找到加权连通图的最小生成树。
  2. 活动选择问题:用于选择最多的不重叠活动,典型的贪心选择是选择结束时间最早的活动。
  3. 背包问题(贪心版的 0-1 背包问题):按物品的单位价值从高到低进行选择,直到装满背包。

算法>贪心算法的优缺点

优点

  • 简单、高效:由于只关注局部最优,算法>贪心算法通常比较简单,运行速度较快。
  • 直接、可实现性强:算法>贪心算法容易实现,对于某些问题是最佳解决方案。

缺点

  • 不适用于所有问题:算法>贪心算法无法保证在所有问题中都能找到全局最优解,尤其是当局部最优解无法组合成全局最优解时。
  • 需要问题具备“贪心选择性质”:即从局部最优能够推导出全局最优。

刷题

买卖股票的最佳时机

题目

121. 买卖股票的最佳时机 - 力扣(LeetCode)

思路

初始思路:以每一个数组元素为买入点,找出利润的最大值,时间复杂度是O(n)

优化思路:在遍历的过程中,我们始终选择当前最小的买入价格,并计算卖出的最大可能利润。

代码

初始代码

public int maxProfit(int[] prices) {int n = prices.length;int max = 0;for (int i = 0; i < n; i++) {for(int j=i+1;j<n;j++){if(prices[j]>prices[i]){max = Math.max(max,prices[j]-prices[i]);}}}return max;}

优化后的代码

public int maxProfit(int[] prices) {int n = prices.length;int max = 0;int min = prices[0];for (int i = 0; i < n; i++) {if(prices[i] < min)min = prices[i];max = Math.max(max, prices[i] - min);}return max;}

跳跃游戏

题目

55. 跳跃游戏 - 力扣(LeetCode)

思路

  • 初始化一个变量 maxReach,表示当前能够到达的最远位置。
  • 遍历数组的每一个元素,对于每个元素 nums[i],检查是否可以从当前位置到达更远的位置,即 maxReach 是否大于或等于当前下标 i。
  • 在遍历的过程中,不断更新能够到达的最远位置 maxReach 为 i + nums[i]。
  • 如果在遍历过程中,某个位置的 maxReach 大于或等于最后一个下标,则返回 true;否则,如果遍历结束仍未达到最后一个下标,则返回 false。

代码

 public boolean canJump(int[] nums) {int n = nums.length;int max = 0;for(int i = 0; i < n; i++) {if(i>max){return false;}max = Math.max(max, nums[i] + i);if(max>=n-1){return true;}}return false;}

跳跃游戏Ⅱ

题目

45. 跳跃游戏 II - 力扣(LeetCode)

思路

1.定义状态:

  • 维护两个变量 curEnd 和 curFarthest:
  • curEnd 表示当前跳跃范围的最远边界。
  • curFarthest 表示通过当前步能够到达的最远位置。

2.遍历数组:

  • 遍历 nums,在每次遍历时,我们会更新 curMax,表示通过当前跳跃可以到达的最远位置。
  • 当遍历到 curEnd 时,表示当前跳跃已经完成,必须进行下一次跳跃,并更新 max 为 curMax,跳跃次数加1。
  • 最后,如果遍历到了数组的最后一个位置,返回跳跃次数即可。

贪心策略:

  • 在每一次跳跃中,我们尽可能向前跳得最远,这样才能保证在最少的跳跃次数内到达数组末尾。

代码

public int jump(int[] nums) {int n = nums.length;int max = 0;int curMax = 0;int sum =0;for(int i = 0; i < n; i++) {if(i==n-1){break;}curMax = Math.max(curMax, nums[i] + i);if(i==max){max = curMax;sum++;}}return sum;}

划分字母区间

题目

763. 划分字母区间 - 力扣(LeetCode)

思路

  • 用一个last数组,记录每个字母出现的最远位置
  • 遍历数组,使用start和end记录当前划分字符串的开头和结尾
  • 每次不断的更新当前字符串的最远位置
  • 当i和end相等,即代表当前字符串划分结束

代码

public List<Integer> partitionLabels(String s) {List<Integer> res = new ArrayList<Integer>();int[] last = new int[26];for(int i=0;i<s.length();i++){last[s.charAt(i)-'a']=i;}int end = 0,start = 0;for(int i=0;i<s.length();i++){end = Math.max(end, last[s.charAt(i)-'a']);if(i==end){res.add(end-start+1);start=i+1;}}return res;}

结语

每次做贪心都觉得自己智商低


http://www.ppmy.cn/devtools/110934.html

相关文章

[网络原理]关于网络的基本概念 及 协议

文章目录 一. 关于网络的概念介绍1. 局域⽹LAN2. ⼴域⽹WAN3. 主机4. 路由器5. 交换机IP地址端口号 二. 协议协议分层TCP/IP五层模型(或四层)OSI七层模型封装分用 一. 关于网络的概念介绍 1. 局域⽹LAN 局域⽹&#xff0c;即 Local Area Network&#xff0c;简称LAN。 Local …

http网络请求与下载进度

Http_request 目录 一、XMLHttpRequest 在使用 Fetch API 进行网络请求时&#xff0c;原生的 Fetch API 并不直接支持获取下载进度的功能&#xff0c;因为 Fetch API 主要是基于 Promise 的&#xff0c;它主要关注于请求的成功或失败&#xff0c;以及响应数据的处理&#xff…

VisualStudio环境搭建C++

Visual Studio环境搭建 说明 C程序编写中&#xff0c;经常需要链接头文件(.h/.hpp)和源文件(.c/.cpp)。这样的好处是&#xff1a;控制主文件的篇幅&#xff0c;让代码架构更加清晰。一般来说头文件里放的是类的申明&#xff0c;函数的申明&#xff0c;全局变量的定义等等。源…

哪款骨传导耳机适合运动?健身党无广安利五款有用的骨传导耳机!

作为一名耳机爱好者&#xff0c;我的耳机收藏可以说是丰富多样&#xff0c;从追求极致音质的头戴式&#xff0c;到便于携带的入耳式&#xff0c;再到近年来兴起的骨传导耳机&#xff0c;我都有所体验。在众多选择中&#xff0c;我最终偏爱上了骨传导耳机&#xff0c;它以其独特…

基于协同过滤算法+SpringBoot+Vue+MySQL的商品推荐系统

系统展示 用户前台界面 管理员后台界面 系统背景 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛运用&#xff0c;以及…

应用层协议——http

目录 http 介绍 urlencode / urldecode http 请求与响应格式 1 请求 2 响应 http 状态码 长连接 会话保持 调试 http 的一些基本工具 telnet postman fidller http 介绍 针对常见场景&#xff0c;早已有大佬们写好了对应的协议&#xff0c;最典型的就是 http 和 ht…

【逐行注释】自适应Q和R的AUKF(自适应无迹卡尔曼滤波),附下载链接

文章目录 自适应Q的KF逐行注释的说明运行结果部分代码各模块解释 自适应Q的KF 自适应无迹卡尔曼滤波&#xff08;Adaptive Unscented Kalman Filter&#xff0c;AUKF&#xff09;是一种用于状态估计的滤波算法。它是基于无迹卡尔曼滤波&#xff08;Unscented Kalman Filter&am…

MyBatis 源码解析:动态 SQL 生成的基本原理

摘要 MyBatis 提供了灵活的动态 SQL 功能&#xff0c;使得开发者可以根据业务需求在运行时生成不同的 SQL 语句。动态 SQL 是 MyBatis 最具特色的功能之一&#xff0c;它允许我们通过条件拼接来生成复杂的查询语句。本文将通过自定义实现一个简化的动态 SQL 生成器&#xff0c…

常见的pytest二次开发功能

pytest框架的二次开发主要是为了满足特定的测试需求或扩展其功能。以下是一些常见的pytest二次开发的功能及其实例&#xff0c;以及如何进行开发的大致步骤&#xff1a; 常见的pytest二次开发功能 定制化测试报告&#xff1a; 功能描述&#xff1a;pytest默认生成的测试报告可…

代码随想录八股训练营第三十九天| C++

前言 一、说一下 lambda函数&#xff1f; 1.1.Lambda 函数的一般语法如下: 1.2.捕获子句&#xff1a; 二、C 怎么实现一个单例模式&#xff1f; 2.1.懒汉式&#xff08;线程不安全&#xff09;: 2.2.饿汉式&#xff08;线程安全&#xff09;: 2.3.双重检查锁定&#xff…

问题解决:系统缺失MSVCR100.dll文件

今天在新电脑使用I2C上位机扫描设备时出现了一个小问题&#xff0c;上位机设备在打开后显示警告&#xff1a;系统缺失MSVCR100.dll文件 一眼盯帧&#xff0c;鉴定为缺失了MSVCR100.dll文件。 这里先介绍下.dll文件的作用&#xff0c;.dll文件&#xff0c;即动态链接库文件&am…

for循环+fork-join_none的隐蔽漏洞

1. 翻车现场 比如某个场景中我们希望用for循环和fork嵌套开辟循环的线程&#xff0c;打印出10个选美者的编号和等级&#xff0c;代码很可能是这样实现的&#xff1a; for (int i0 ; i<10; i) beginfork$display(“No%0d&#xff0c;My face_grade is %0d”, i &#xff0c…

【苍穹外卖】前端 Day 1

1 Vue 1.1 通过 vue cli 脚手架创建前端工程 1.2 项目结构 1.3 启动项目 VS Code 启动前端项目&#xff1a; npm run serve 注意这里占用端口号 8080 与 java springboot 占用端口号一致&#xff0c;有冲突 serve 是这个名字 终止&#xff1a;ctrl c 修改端口号 2 vue 基本…

MyBatis-Plus 与 Mockito:解决 Lambda 缓存初始化问题

问题背景 MyBatis-Plus 提供了便捷的 Lambda 查询表达式&#xff0c;但它依赖于实体类与数据库表的映射缓存。如果在测试环境中&#xff0c;这些映射未正确初始化&#xff0c;可能导致 can not find lambda cache for this entity 异常。这一问题特别容易在与 Mockito 搭配使用…

Chai-1:药物分子结构预测的新型多模态基础模型

参考: https://www.chaidiscovery.com/blog/introducing-chai-1 https://github.com/chaidiscovery/chai-lab https://chaiassets.com/chai-1/paper/technical_report_v1.pdf 这是一种用于分子结构预测的新型多模态基础模型,可在与药物发现相关的各种任务中执行最先进的功能。…

安装Anaconda(过程)

Anaconda是一个开源的Python发行版本&#xff0c;用来管理Python相关的包&#xff0c;安装Anaconda可以很方便的切换不同的环境&#xff0c;使用不同的深度学习框架开发项目&#xff0c;本文将详细介绍Anaconda的安装。 一、安装 1、安装方式 官网&#xff1a;“https://www.…

编译原理/软件工程核心概念-问题理解

目录 1.程序的编译执行过程 2.指针和引用的区别 3.堆和栈的区别 4.最熟悉的编程语言- Python&#xff1a;介绍PyTorch和TensorFlow框架 5.C与C的区别 6.软件工程是什么&#xff1f; 7.简述瀑布模型 8.敏捷开发方法是什么&#xff1f;它与瀑布模型相比有哪些优势和劣势 1…

idear导入他人项目如何快速运行

最近idear经常导入别人的项目&#xff0c;结果永远在加载依赖项。网上查了一堆资料&#xff0c;什么jdk问题&#xff0c;环境变量问题&#xff0c;maven仓库路径问题&#xff0c;总之就是没啥用。那有没有什么简单粗暴的办法&#xff0c;能够导入项目后快速运行呢。 解决方法&a…

C++ 类型转换

前言 在C中&#xff0c;类型转换是指将一个变量或表达式从一种数据类型转换为另一种数据类型的过程。类型转换有两种基本形式&#xff1a;隐式类型转换和显式类型转换。 隐式转换 这是编译器自动进行的类型转换&#xff0c;通常发生在不同类型的变量进行运算时。例如&#x…

Angular-Cli脚手架介绍、安装并搭建项目

创建一个项目# 在创建项目之前&#xff0c;请确保 angular/cli 已被成功安装。 执行以下命令&#xff0c;angular/cli 会在当前目录下新建一个名称为 PROJECT-NAME 的文件夹&#xff0c;并自动安装好相应依赖。 $ ng new PROJECT-NAME 注意: 有可能会报错类似下面这种 The A…