力扣100题——贪心算法

embedded/2024/9/20 7:19:52/ 标签: 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/embedded/113315.html

相关文章

Nginx实用篇:实现负载均衡、限流与动静分离

Nginx实用篇&#xff1a;实现负载均衡、限流与动静分离 | 原创作者/编辑&#xff1a;凯哥Java | 分类&#xff1a;Nginx学习系列教程 Nginx 作为一款高性能的 HTTP 服务器及反向代理解决方案&#xff0c;在互联网架构中扮演着至关重要的角色。它…

如何搭建一个ip池用来做数据抓取用

在当今的数据驱动时代&#xff0c;数据抓取成为了获取网络信息的重要手段。然而&#xff0c;频繁的数据抓取活动可能会触发网站的安全机制&#xff0c;导致IP被封禁。为了维持数据抓取的持续性和稳定性&#xff0c;构建一个有效的IP池变得至关重要。本文将详细介绍如何搭建一个…

好用的XML解析库——fast-xml-parser

有时候需要在前台用到xml的解析&#xff0c;并且可能需要解析后再重新生成xml字符串&#xff0c;这个时候就可以用到fast-xml-parser了。 优点 使用简单&#xff0c;主要有两个对象&#xff0c;分别是XMLParser和XMLBuilder。 主要需要关注的属性有 ignoreAttributes 和 supp…

ASR(自动语音识别)识别文本效果的打分总结

ASR(自动语音识别)识别文本效果的打分总结 1. 词错误率(WER, Word Error Rate)2. 字正确率(W.Corr, Word Correct)3. 编辑距离(Edit Distance)4. 特定错误率5. 句子错误率(SER, Sentence Error Rate)6. 基于模型的评估方法对于ASR(自动语音识别)识别文本效果的打分…

HtmlRender - c++实现的html生成类

HtmlRender 在CppTinParser/render.hpp中定义和实现。 使用c实现的简易Html编辑类。 简介 目前&#xff0c;c有几个Html解析器&#xff0c;而少见便捷规范的html生成器&#xff0c;HtmlRender则提供了一个简单的、规范的html内容生成器。用c实现html内容生成器&#xff0c;…

vue3项目实现全局国际化

本文主要梳理vue3项目实现全项目格式化&#xff0c;例如在我前面文章使用若依创建vue3的项目中&#xff0c;地址&#xff1a;若依搭建vue3项目在导航栏中切换&#xff0c;页面中所有的组件的默认语言随之切换&#xff0c;使用的组件库依旧是element-plus&#xff0c;搭配vue-i1…

Java应用压测工具JMeter

目录 1、下载JMeter 2、配置环境变量 3、配置语音 4、使用 1、下载JMeter Apache JMeter - Apache JMeter™ 千万别下载这个&#xff0c;会报错、 千万别下载这个&#xff0c;会报错、 千万别下载这个&#xff0c;会报错 下载这个&#xff0c;失败多下载几次 2、配置环…

中国数据中心服务器CPU行业发展概述

2024中国服务器CPU行业概览&#xff1a;信创带动服务器CPU国产化 AA体系是一种基于ARM指令系统和Android操作系统的体系结构&#xff0c;主要用于移动设备。与Wintel体系不同&#xff0c;AA体系中CPU厂商对芯片或系统厂商进行指令系统或IP核授权&#xff0c;操作系统厂商提供基…

【乐企-业务篇】开票前置校验服务-规则链服务接口实现(纳税人基本信息)

开票前置校验服务-规则链服务接口实现(纳税人基本信息) 代码 import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3

C++使用Socket编程实现一个简单的HTTP服务器

C使用Socket编程实现一个简单的HTTP服务器 在现代网络编程中&#xff0c;HTTP服务器是一个非常重要的组件。通过实现一个简单的HTTP服务器&#xff0c;可以帮助我们更好地理解网络通信的基本原理。本文将详细介绍如何使用C进行Socket编程&#xff0c;实现一个简单的HTTP服务器…

Cartographer源码理解

一、前言 最近一个半月&#xff0c;利用空余时间对Cartographer源码进行了简单的阅读&#xff0c;在这里做了个简单梳理&#xff0c;和大家分享交流。 cartographer源码量其实是有点大的&#xff0c;逐行逐句去解释实在是有心无力了&#xff0c;而且已经有大佬做了类似的事情…

macOS Sequoia 正式版(24A335)黑苹果/Mac/虚拟机系统镜像

“ 以下内容来自于黑果魏叔官网” 镜像特点 完全由黑果魏叔官方制作&#xff0c;针对各种机型进行默认配置&#xff0c;让黑苹果安装不再困难。系统镜像设置为双引导分区&#xff0c;全面去除clover引导分区&#xff08;如有需要&#xff0c;可以自行直接替换opencore分区文件为…

JVM 性能优化与调优-ZGC(Z Garbage Collector)

JVM 性能优化与调优——ZGC&#xff08;Z Garbage Collector&#xff09; 在 JVM 性能优化中&#xff0c;垃圾收集器的选择和调优至关重要。垃圾收集器&#xff08;Garbage Collector, GC&#xff09;负责回收不再使用的对象所占用的内存&#xff0c;以便应用程序可以高效使用…

算法入门-贪心1

第八部分&#xff1a;贪心 409.最长回文串&#xff08;简单&#xff09; 给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回通过这些字母构造成的最长的回文串 的长度。 在构造过程中&#xff0c;请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串…

docker_持久化存储

Docker Volumes 单机部署 要在 Docker 中使用 Volumes&#xff08;卷&#xff09; 来实现持久化存储&#xff0c;步骤非常简单。以下是具体的操作方法&#xff1a; 创建一个 Docker Volume 你可以通过 Docker CLI 来创建卷。执行以下命令创建一个名为 my_volume 的卷&#xf…

单片机中为什么要使用5v转3.3v,不直接使用3.3V电压

5V和3.3V是常见的电压水平&#xff0c;在技术上都有其特定的应用场景。为了保护电路、提升效能和确保系统的稳定运行&#xff0c;经常需要将5V转换为3.3V。 1.为什么要5V来供电 使用5V是因为部分传感器需要5V的供电&#xff0c;并且我们数据线一般都输出5V电压&#xff0c;而…

Web3入门指南:从基础概念到实际应用

Web3&#xff0c;即“去中心化的第三代互联网”&#xff0c;正在逐步改变我们对互联网的传统认知。从最初的静态网页&#xff08;Web1.0&#xff09;到互动平台和社交媒体为主的互联网&#xff08;Web2.0&#xff09;&#xff0c;Web3的目标是让用户重新掌握对数据和数字资产的…

leetcode 四数相加||

1.题目要求: 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a;0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0示例 1&#xff1a;输入&#xff1a;nums1 …

Hutool 使用详解

Hutool 是一个 Java 工具包&#xff0c;它为开发者提供了一系列实用的工具类和方法&#xff0c;帮助简化开发工作。本文将详细介绍 Hutool 的主要功能和使用方法&#xff0c;帮助开发者更好地利用这个强大的工具包。 目录 Hutool 简介Hutool 的安装与配置常用工具类介绍 字符…

【MySQL】MySQL中JDBC编程——MySQL驱动包安装——(超详解)

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解Java中JDBC编程&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;【MySQL】MySQL索引与事务的透析——&#xff08;超详解&#xff09;-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&a…