贪心算法03(leetcode1005,134,135)

参考资料:

https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.html

1005. K 次取反后最大化的数组和

题目描述:

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

  • 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。

重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组 可能的最大和 。

示例 1:

输入:nums = [4,2,3], k = 1
输出:5
解释:选择下标 1 ,nums 变为 [4,-2,3] 。

思路分析:

两次贪心:

1. 选绝对值最大的负数反转——>全局

2. (负数翻转完后k>0)选绝对值最小的反转——>全局

代码实现:

//法一:凭感觉做
// class Solution {
//     public int largestSumAfterKNegations(int[] nums, int k) {
//         Arrays.sort(nums);
//         int index=0;
//         int res=0;
//         while(k>0 && index<nums.length){
//             if(nums[index]<0){
//                 if(index+1<nums.length && nums[index+1]<=0){
//                     nums[index]=-nums[index];
//                     k--;
//                     index++;
//                     continue;
//                 }else if(index+1<nums.length && nums[index+1]>0 ){//分别是两个绝对最小数,- +
//                     if(k%2==1){//奇数次
//                         nums[index]=-nums[index];
//                         break;
//                     }else{//偶数次=奇+奇
//                         if(-nums[index]<nums[index+1]){//负数绝对值较小
//                             break;
//                         }else{
//                             nums[index]=-nums[index];
//                             nums[index+1]=-nums[index+1];
//                             break;
//                         }
//                     }                    
//                 }else if(index+1==nums.length){
//                     if(k%2==1){
//                         nums[index]=-nums[index];
//                         break;
//                     }else{
//                         break;
//                     }
//                 }
//             }else if(nums[index]==0) break;//都在0处翻,等于没翻
//             else{//大于0
//                 if(k%2==0) break;//偶数次,翻完等于没翻
//                 nums[index]=-nums[index];//奇数次,翻一次
//                 break;
//             }
//         }//         for(int i=0;i<nums.length;i++){
//             res+=nums[i];
//         }
//         return res;
//     }
// }//贪心*2
class Solution {public int largestSumAfterKNegations(int[] nums, int k) {//按绝对值,从大到小排nums = IntStream.of(nums).boxed().sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1)).mapToInt(Integer::intValue).toArray();int len=nums.length;for(int i=0;i<len;i++){//选数值最大的复数反转——>全局if(k>0 && nums[i]<0){nums[i]=-nums[i];k--;}}if(k%2==1){//选数值最小的反转——>全局nums[len-1]=-nums[len-1];}return Arrays.stream(nums).sum();}
}

134. 加油站

题目描述:

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

示例 1:

输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
输出: 3
解释:
从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
因此,3 可为起始索引。

思路分析:

局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。

全局最优:找到可以跑一圈的起始位置。

代码实现:

//贪心法
//局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。
//全局最优:找到可以跑一圈的起始位置。
class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int res=0;int curSum=0;//随着选取的起点变化int totalSum=0;//与起点无关for(int i=0;i<gas.length;i++){curSum += gas[i]-cost[i];totalSum += gas[i]-cost[i];if(curSum<0){curSum=0;res=(i+1)%gas.length;}}if(totalSum<0) return -1;return res;}
}

 135. 分发糖果

题目描述:

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

  • 每个孩子至少分配到 1 个糖果。
  • 相邻两个孩子评分更高的孩子会获得更多的糖果。

请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

示例 1:

输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。

思路分析:

局部——>全局:相邻孩子中,评分高的获得更多糖果。

分别从前往后判断 左<右情况

从后往前判断 左>右情况

代码实现:

//贪心*2
//局部最优推出全局最优,即:相邻的孩子中,评分高的孩子获得更多的糖果
class Solution {public int candy(int[] ratings) {int len=ratings.length;int[] give=new int[len];give[0]=1;//1.左<右for(int i=1;i<len;i++){give[i]= (ratings[i] > ratings[i-1]) ? give[i-1]+1 : 1;}//2.左>右for(int i=len-2;i>=0;i--){if(ratings[i] > ratings[i+1]){give[i]=Math.max(give[i],give[i+1]+1);}}// int res= Arrays.stream(give).sum();int res=0;for(int num : give){res+=num;}return res;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/25162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

覆盖路径规划经典算法 The Boustrophedon Cellular Decomposition 论文及代码详解

2000年一篇论文 Coverage of Known Spaces: The Boustrophedon Cellular Decomposition 横空出世&#xff0c;解决了很多计算机和机器人领域的覆盖路径问题&#xff0c;今天我来详细解读这个算法。 The Boustrophedon Cellular Decomposition 算法详解 这篇论文标题为"C…

arm系统中双网卡共存问题

文章目录 单网卡单独运行双网卡共存问题双网卡解决方案方案一方案二方案三验证双网卡通过网卡名获取IP通过TCP与服务端通信参考单网卡单独运行 双网卡共存问题 双网卡解决方案 方案一 https://blog.csdn.net/HowieXue/article/details/75937972 方案二 http://bbs.witech…

办理公司诉讼记录删除行政处罚记录删除

企业行政处罚记录是可以做到撤销消除的&#xff0c;一直被大多数企业忽略&#xff0c;如果相关诉讼记录得不到及时删除&#xff0c;不仅影响企业招投标&#xff0c;还影响企业的贷款申请&#xff0c;严重的让企业资金链断裂&#xff0c;影响企业长远发展和企业形象。行政处罚是…

SpringBoot整合RabbitMQ实现消息延迟队列

环境依赖 SpringBoot 3.1.0 JDK 17 前期准备 安装MQ: liunxdockerrabbitmq安装延迟队列插件 实例 实现延迟队列的一种方式是在 RabbitMQ 中使用消息延迟插件&#xff0c;这个插件可以让你在消息发送时设置一个延迟时间&#xff0c;超过这个时间后消息才会被消费者接收到…

Vyper重入漏洞解析

什么是重入攻击 Reentrancy攻击是以太坊智能合约中最具破坏性的攻击之一。当一个函数对另一个不可信合约进行外部调用时&#xff0c;就会发生重入攻击。然后&#xff0c;不可信合约会递归调用原始函数&#xff0c;试图耗尽资金。 当合约在发送资金之前未能更新其状态时&#…

Dubbo 3.x源码(20)—Dubbo服务引用源码(3)

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了调用createProxy方法&#xff0c;根据服务引用参数map创建服务接口代理引用对象的整体流程&#xff0c;我们知道会调用createInvokerForRemote方法创建远程引用Invoker&#xff0c;这是Dubbo …

深入理解Python:多线程与多进程编程

深入理解Python:多线程与多进程编程 在现代软件开发中,充分利用计算机的多核处理能力来提升程序的性能是至关重要的。Python提供了多线程和多进程两种并发编程方式。本文将深入探讨这两种并发编程的基本概念、使用方法以及各自的优缺点,并通过实际代码示例展示其应用。 目…

总结七大排序算法

插入排序 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。实际中我们玩扑克牌时&#xff0c;就用了…

QML键盘事件的用法和示例

文章目录 处理单一按键处理组合键处理快捷键在QML中,键盘事件通常通过Keys对象和相关的事件处理器来管理。这些事件处理器可以直接添加到任何接受键盘输入的QML元素中。这里介绍一下各种键盘事件的处理方式。 处理单一按键 处理单一按键的方式比较简单,直接在元素的Keys对象…

Python Mistune库:Markdown解析和处理

更多Python学习内容&#xff1a;ipengtao.com Mistune是一个用于Python的快速且功能强大的Markdown解析库。它以其高性能和灵活性著称&#xff0c;能够轻松扩展和定制。Mistune支持标准的Markdown语法&#xff0c;并且可以通过插件扩展支持更多功能&#xff0c;例如数学公式、高…

数据结构严蔚敏版精简版-栈和队列以及c语言代码实现

1栈的定义和特权 栈(stack)是限定仅在表尾进行插入或删除操作的线性表。 注&#xff1a;虽然说栈的实现就是一端插入和删除&#xff0c;但不一定是在“表尾”&#xff0c;这个“表尾”是广义的。 头插法实现链栈 尾插法实现链栈 因此&#xff0c;对栈来说&#xff0c;表尾…

4. 流程控制语句

文章目录 4.1 if 条件语句4.1.1 单分支4.1.2 双分支4.1.3 多分支 4.2 退出程序4.3 case语句 4.1 if 条件语句 4.1.1 单分支 语法如下&#xff1a; if <条件表达式> then指令 fi或者 if <条件表达式>; then指令 fi使用示例&#xff1a;判断是否已经成功挂载光盘&…

JAVA 整合 RabbitMQ

maven pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/…

Web后端开发(请求-实体参数)(二)

简单实体对象&#xff1a;请求参数名与形参对象属性名相同&#xff0c;定义对象(POJO)接收即可 RequestMapping("/simplePojo") public String simplePojo(User user){System.out.println(user);return "OK"; } public class User{private String name;p…

算法——Floyd判圈算法

介绍 Floyd判圈算法用于判断一个链表中是否有环。 思想 使用快慢指针fast, slow&#xff0c;快指针每次走两步fast fast.next.next&#xff0c;慢指针每次走一步slow slow.next。当出现fast null || fast.next null时&#xff0c;说明链表不存在环&#xff0c;如果存在环…

1.2-自然语言的分布式表示-基于计数的方法

本篇笔记对应的视频链接为&#xff1a; 3-基于计数的方法表示单词-将文字转换成编号的预处理工作_哔哩哔哩_bilibili&#xff1b;4-基于计数的方法表示单词-使用共现矩阵进行单词的分布式表示_哔哩哔哩_bilibili&#xff1b;5-基于计数的方法表示单词-单词之间相似度计算_哔哩哔…

计算机网络 —— 网络层(CIDR)

计算机网络 —— 网络层&#xff08;CIDR&#xff09; CIDR的提出背景什么是CIDR基本概念划分示例应用优势 举个例子路由聚合常用数字 我们今天来看IPv4地址划分的另一种方法 —— CIDR。 CIDR的提出背景 CIDR&#xff08;无类域间路由&#xff0c;Classless Inter-Domain Ro…

大众汽车裁员加速,38万元遣散费起步

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 几周前&#xff0c;大众汽车宣布了一项新的裁员计划。 一、裁员行动与额外福利并行 大众汽车近期在裁员行动上取得了显著进展&#xff0c;其遣散…

深度解析:AI Prompt 提示词工程的兴起、争议与未来发展

PART1: 提示词工程的兴起 在人工智能领域中&#xff0c;一个新的领域——提示词工程&#xff08;prompt engineering&#xff09;——开始显露头角。 这个领域的核心在于精心设计输入&#xff0c;以引导AI模型产生特定的、期望的输出。 随着AI技术的飞速发展&#xff0c;特别…

Spark MLlib 机器学习

Spark MLlib是一个在Apache Spark上构建的机器学习库&#xff0c;用于解决大规模数据集上的机器学习问题。它提供了一组丰富的机器学习算法和工具&#xff0c;可以用于分类、回归、聚类、推荐和协同过滤等任务。同时&#xff0c;它还提供了一些特征提取、特征转换和特征选择的工…