15-贪心算法

devtools/2025/2/25 22:35:26/

一,定义

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

算法>贪心算法的特点是:

  1. 局部最优:在每一步选择中,都选择当前看起来最好的选项。

  2. 不可回退:一旦做出选择,就不再回头重新考虑。

  3. 希望全局最优:通过一系列局部最优的选择,最终达到全局最优。

算法>贪心算法并不一定能得到全局最优解,但在某些问题中,它可以高效地找到一个接近最优的解。


举个例子

假设你有以下硬币面值:1 元、5 元、10 元,现在需要凑出 18 元,如何使用最少的硬币?

算法>贪心算法的思路是:

  1. 每次都选择面值最大的硬币

  2. 先用 10 元,剩下 8 元。

  3. 再用 5 元,剩下 3 元。

  4. 最后用 3 个 1 元。

  5. 总共用了 5 个硬币(10 + 5 + 1 + 1 + 1)。

在这个例子中,算法>贪心算法得到了最优解。但需要注意的是,算法>贪心算法并不总是能得到最优解。比如,如果硬币面值是 1 元、4 元、5 元,要凑出 8 元:

  • 算法>贪心算法会选择 5 + 1 + 1 + 1,用了 4 个硬币。

  • 但实际上最优解是 4 + 4,只用 2 个硬币。


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

算法>贪心算法适用于满足以下条件的问题:

  1. 最优子结构:问题的最优解可以通过子问题的最优解推导出来。

  2. 贪心选择性质:每一步的局部最优选择能够导致全局最优解。

常见的算法>贪心算法应用场景包括:

  • 找零钱问题(如上面的硬币例子)。

  • 活动选择问题(选择最多的互不冲突的活动)。

  • 最小生成树问题(如 Kruskal 算法和 Prim 算法)。

  • 霍夫曼编码(用于数据压缩)。


算法>贪心算法的优缺点

优点:
  • 简单直观:容易理解和实现。

  • 高效:通常时间复杂度较低。

缺点:
  • 不一定得到全局最优解算法>贪心算法只能保证局部最优,不能保证全局最优。

  • 需要证明正确性:在使用算法>贪心算法时,通常需要证明它能够得到全局最优解。

二,举例

        1.最长连续递增序列:给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。

public class demo01 {public static void main(String[] args) {System.out.println(findLength(new int[]{1,2,3,2,3,4,3,4,5,6,7}));}public static int findLength(int[] nums) {int start = 0;int max = 0;for (int i = 1; i < nums.length; i++) {if (nums[i] <= nums[i-1]) {start = i;}max=Math.max(max,i-start+1);}return max;}
}

        2.在柠檬水摊上,每一杯柠檬水的售价为5美元。顾客排队购买你的产品,一次购买一杯。

每位顾客只卖一杯柠檬水,然后向你付5美元、10美元或20美元。必须给每个顾客正确找零。注意,一开始你手头没有任何零钱,如果你能给每位顾客正确找零,返回为true,否则返回false。

public class demo01 {public static void main(String[] args) {System.out.println(change(new int[]{5,5,20}));}public static boolean change(int[] bills) {int five=0,ten=0;for(int i=0;i<bills.length;i++){if(bills[i]==5){five++;         //此时多了一张5块}else if(bills[i]==10){if(five==0){return false;}five--;ten++;}else{                   //来了一张20if(five>0&&ten>0){  //如果有5块和10块five--;ten--;}else if(five>=3){  //或者有三张以上的5块five-=3;}else {return false;}}}return true;}
}

        3.三角形的最大周长:给定一些正数(代表长度)组成的数组arr,返回由其中三个长度组成的、面积不为0的三角形的最大周长。如果不能形成任何面积不为0的三角形,返回0.

import java.util.Arrays;public class demo01 {public static void main(String[] args) {System.out.println(length(new int[]{3,6,2,3}));}public static int length(int[] nums) {Arrays.sort(nums);          //先排序for (int i = nums.length-1; i >=2; i--) {if (nums[i-1]+ nums[i-2]>nums[i]) {return nums[i-1]+nums[i-2]+nums[i];}}return 0;}
}


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

相关文章

Eureka、ZooKeeper 和 Nacos 之间的对比

Eureka、ZooKeeper 和 Nacos 都是分布式系统中常用的服务注册与发现工具&#xff0c;但它们的定位、功能和适用场景有所不同。作为一名开发者&#xff0c;理解它们之间的对比有助于选择合适的技术栈。以下从多个维度进行详细比较&#xff1a; 1. 基本概述 Eureka 来源&#xff…

开源一款I2C电机驱动扩展板-FreakStudio多米诺系列

总线直流电机扩展板 原文链接&#xff1a; FreakStudio的博客 摘要 设计了一个I2C电机驱动板&#xff0c;通过I2C接口控制多个电机的转速和方向&#xff0c;支持刹车和减速功能。可连接16个扩展板&#xff0c;具有PWM输出、过流过热保护和可更换电机驱动芯片。支持按键控制…

Redis存在线程安全吗?为什么?

Redis 在设计和使用层面具备较高的线程安全性&#xff0c;下面从多个方面详细阐述其线程安全特性及原因。 Redis 单线程模型下的线程安全 Redis 在处理网络请求时采用单线程模型&#xff08;Redis 6.0 之前核心网络 I/O 和命令执行都是单线程&#xff0c;Redis 6.0 引入了多线…

escape SQL中用法

select * from tablename where username like %#%% escape # 这个的意思就是&#xff0c;escape指定字符#&#xff0c;#字符后面的第一个字符被认为是普通字符 查询示例2 查询username字段中包含[的数据也是一样&#xff0c;即&#xff1a; select * from tablename where us…

Android Java创建ViewModel新api

背景 项目使用Java&#xff0c;创建ViewModel发现之前旧api不管用了。不要问为什么项目还要用Java&#xff0c;别问。老项目不让升级。 ViewModel创建新方式 新方式是因为依赖新版本库&#xff0c;其实用旧版本库就回到旧方式了。 依赖&#xff1a; def lifecycle_version …

C++ 继承,多态

看前须知&#xff1a; 本篇博客是作者听课时的笔记&#xff0c;不喜勿喷&#xff0c;若有疑问可以评论区一起讨论。 继承 定义&#xff1a; 继承机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段&#xff0c;它允许我们在保持原有 类特性的基础上进⾏扩展&#xff0c;增…

PyTorch gather 方法详解:作用、应用场景与示例解析(中英双语)

PyTorch gather 方法详解&#xff1a;作用、应用场景与示例解析 在深度学习和自然语言处理&#xff08;NLP&#xff09;任务中&#xff0c;我们经常需要从高维张量中提取特定索引的数据。 PyTorch 提供的 torch.gather 方法可以高效地从张量的指定维度收集数据&#xff0c;广泛…

工业级无人机手持地面站技术详解

工业级无人机手持地面站是无人机系统的核心组成部分&#xff0c;它集控制、通信、数据处理于一体&#xff0c;为无人机的安全飞行和任务执行提供全面支持。以下是对工业级无人机手持地面站技术的详细解析&#xff1a; 一、硬件构成 1. 处理器与操作系统&#xff1a; 工业级手…