34.贪心算法1

news/2025/7/8 19:42:02/

0.贪心算法

 

1.柠檬水找零(easy)

. - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {public boolean lemonadeChange(int[] bills) {int five = 0, ten = 0;for (int x : bills) {if (x == 5) // 5 元:直接收下{five++;} else if (x == 10) // 10 元:找零 5 元{if (five == 0)return false;five--;ten++;} else // 20 元:分情况讨论{if (five != 0 && ten != 0) // 贪⼼{five--;ten--;} else if (five >= 3) {five -= 3;} elsereturn false;}}return true;}
}

2.将数组和减半的最少操作次数

2208. 将数组和减半的最少操作次数 - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {public int halveArray(int[] nums) {// 创建⼀个⼤根堆PriorityQueue<Double> heap = new PriorityQueue<>((a, b) -> b.compareTo(a));double sum = 0.0;for (int x : nums) // 把元素都丢进堆中,并求出累加和{heap.offer((double) x);sum += x;}sum /= 2.0; // 先算出⽬标和int count = 0;while (sum > 0) // 依次取出堆顶元素减半,直到减到之前的⼀半以下{double t = heap.poll() / 2.0;sum -= t;count++;heap.offer(t);}return count;}
}

3.最大数

179. 最大数 - 力扣(LeetCode)

题目解析

算法原理

 

---全序性

 

 

代码

class Solution {public String largestNumber(int[] nums) {// 优化:把所有的数转化成字符串int n = nums.length;String[] strs = new String[n];for (int i = 0; i < n; i++)strs[i] = "" + nums[i];// 排序Arrays.sort(strs, (a, b) -> {return (b + a).compareTo(a + b);});// 提取结果StringBuffer ret = new StringBuffer();for (String s : strs)ret.append(s);if (ret.charAt(0) == '0')return "0";return ret.toString();}
}

4.摆动序列(medium)

376. 摆动序列 - 力扣(LeetCode)

题目解析

算法原理

 

代码

class Solution {public int wiggleMaxLength(int[] nums) {int n = nums.length;if (n < 2)return n;int ret = 0, left = 0;for (int i = 0; i < n - 1; i++) {int right = nums[i + 1] - nums[i]; // 计算接下来的趋势if (right == 0)continue; // 如果⽔平,直接跳过if (left * right <= 0)ret++; // 累加波峰或者波⾕left = right;}return ret + 1;}
}

5.最长递增子序列(medium)

300. 最长递增子序列 - 力扣(LeetCode)

题目解析

算法原理

 

代码

class Solution {public int lengthOfLIS(int[] nums) {ArrayList<Integer> ret = new ArrayList<>();int n = nums.length;ret.add(nums[0]);for (int i = 1; i < n; i++) {if (nums[i] > ret.get(ret.size() - 1)) // 如果能接在最后⼀个元素后⾯,直接放{ret.add(nums[i]);} else {// ⼆分插⼊位置int left = 0, right = ret.size() - 1;while (left < right) {int mid = (left + right) / 2;if (ret.get(mid) < nums[i])left = mid + 1;elseright = mid;}ret.set(left, nums[i]); // 放在 left 位置上}}return ret.size();}
}

6.递增的三元子序列(medium)

334. 递增的三元子序列 - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {public boolean increasingTriplet(int[] nums) {int a = nums[0], b = Integer.MAX_VALUE;for (int i = 1; i < nums.length; i++) {if (nums[i] > b)return true;else if (nums[i] > a)b = nums[i];elsea = nums[i];}return false;}
}

7.最长连续递增序列

674. 最长连续递增序列 - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {public int findLengthOfLCIS(int[] nums) {int ret = 0, n = nums.length;for (int i = 0; i < n;) {int j = i + 1;// 找到递增区间的末端while (j < n && nums[j] > nums[j - 1])j++;ret = Math.max(ret, j - i);i = j; // 循环内部直接更新下⼀个位置的起点 - 贪⼼}return ret;}
}

8.买卖股票的最佳时机(easy)

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

题目解析

算法原理

代码

class Solution {public int maxProfit(int[] prices) {int ret = 0; // 记录最终结果for (int i = 0, prevMin = Integer.MAX_VALUE; i < prices.length; i++) {ret = Math.max(ret, prices[i] - prevMin); // 先更新结果prevMin = Math.min(prevMin, prices[i]); // 再更新最⼩值}return ret;}
}

9.买卖股票的最佳时机 Ⅱ(medium)

. - 力扣(LeetCode)

题目解析

算法原理

 

代码

class Solution {public int maxProfit(int[] prices) {// 实现⽅式⼀:双指针int ret = 0, n = prices.length;for(int i = 0; i < n; i++){int j = i;while(j + 1 < n && prices[j] < prices[j + 1]) j++; // 向后寻找上升的末端ret += prices[j] - prices[i];i = j;}return ret;}
}class Solution {public int maxProfit(int[] prices) {// 实现⽅式⼆:拆分成⼀天⼀天的形式int ret = 0;for (int i = 1; i < prices.length; i++) {if (prices[i] > prices[i - 1]) {ret += prices[i] - prices[i - 1];}}return ret;}
}

10.K 次取反后最大化的数组和(easy)

. - 力扣(LeetCode)

题目解析

算法原理

代码

class Solution {public int largestSumAfterKNegations(int[] nums, int k) {int m = 0, minElem = Integer.MAX_VALUE, n = nums.length;for (int x : nums) {if (x < 0)m++;minElem = Math.min(minElem, Math.abs(x));}// 分类讨论int ret = 0;if (m > k) {Arrays.sort(nums);for (int i = 0; i < k; i++) // 前 k ⼩个负数,变成正数{ret += -nums[i];}for (int i = k; i < n; i++) // 后⾯的数不变{ret += nums[i];}} else {// 把负数全部变成正数for (int x : nums)ret += Math.abs(x);if ((k - m) % 2 != 0) // 判断是否处理最⼩的正数{ret -= minElem * 2;}}return ret;}
}


http://www.ppmy.cn/news/1527267.html

相关文章

基于微信小程序的科创微应用平台设计与实现+ssm(lw+演示+源码+运行)

基于微信小程序的科创微应用平台 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于微信小程序的科创微应用平台的开发全过程。通过分析基于微信小程序的科创微应用平台管理的不足&#xff0c;创建了一个计…

基于PSO-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 PSO粒子群优化 4.2 svm 4.3 PSO-SVM 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) pso优化SVM过程&#xff1a; 识别率对比&#xff1a; 2.算法运行软件版本 …

docker如何实现资源隔离

Docker 通过多种机制实现了资源隔离&#xff0c;这些机制包括命名空间&#xff08;namespaces&#xff09;、控制组&#xff08;control groups, cgroups&#xff09;以及其他容器相关的技术。下面详细介绍 Docker 如何使用这些技术来实现资源隔离。 1. 命名空间&#xff08;N…

一步到位:通过 Docker Compose 部署 EFK 进行 Docker 日志采集

一、EFK简介 Elasticsearch&#xff1a;一个开源的分布式搜索和分析引擎&#xff0c;用于存储和查询日志数据。它是 EFK 的核心组件&#xff0c;负责高效地存储和检索日志信息。 Filebeat&#xff1a;一个轻量级的日志采集器&#xff0c;主要用于将日志文件数据发送到 Logsta…

RFID射频模块(MFRC522 STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 MFRC522.h文件 MFRC522.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 RC522 RFID射频模块是一款广泛应用于非接触式RFID系统中的核心组件&#xff0c;由NXP&…

裸金属服务器怎么实现算力共享,裸金属服务器提供者怎么做,租户怎样使用,共享平台需要搭建什么

目录 裸金属服务器怎么实现算力共享,裸金属服务器提供者怎么做,租户怎样使用,共享平台需要搭建什么 裸金属服务器提供者怎么做 租户怎样使用 共享平台需要搭建什么 裸金属服务器怎么实现算力共享,裸金属服务器提供者怎么做,租户怎样使用,共享平台需要搭建什么 裸金属…

xshell密钥方式连接阿里云Linux

前提条件 有阿里云ECS linux实例安装好xshell工具 步骤 创建密钥对并绑定ECS实例 浏览器登录阿里云-->控制台-->ECS服务器-->网络与安全-->密钥对-->创建密钥对 根据提示填写密钥名称-->选中默认资源组-->创建 创建完成&#xff0c;会自动下载密钥对的…

【Qt笔记】QScrollArea控件详解

目录 引言 一、QScrollArea 的基本概念 二、QScrollArea 的主要属性 2.1 设置内容大小是否随滚动区域变化 2.2 设置水平与垂直滚动条 2.3 设置视口外边距 三、QScrollArea 的常用方法 3.1 设置显示小部件 3.2 返回当前设置的小部件 3.3 设置内部小部件是否可以填充…