当前位置: 首页 > news >正文

贪心算法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;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 一文学习yolov5 实例分割:从训练到部署
  • Spring RestClient报错:400 Bad Request : [no body]
  • CentOS7 配置Nginx域名HTTPS
  • React@16.x(23)useEffect
  • [ue5]建模场景学习笔记(5)——必修内容可交互的地形,交互沙(3)
  • Spring Boot 深度学习笔记:从入门到精通的全面指南
  • 【报文数据流中的反压处理】
  • CleanMyMac2024最新免费电脑Mac系统优化工具
  • SQL Server中的CTE和临时表优化
  • C语言 | Leetcode C语言题解之第140题单词拆分II
  • CMakeLists如何多行注释
  • 计算机毕业设计python+spark知识图谱音乐推荐系统 音乐数据分析可视化大屏 音乐爬虫 LSTM情感分析 大数据毕设 深度学习 机器学习
  • RoLabelImg下载及旋转目标检测数据标注
  • Linux | buildrootfs 添加mkfs.ext3/mkfs.ext4 支持
  • 【算法小记】深度学习——时间序列数据分析 Time series Data Analysis
  • crontab执行失败的多种原因
  • jdbc就是这么简单
  • JSDuck 与 AngularJS 融合技巧
  • Linux CTF 逆向入门
  • Python语法速览与机器学习开发环境搭建
  • 关于for循环的简单归纳
  • 猴子数据域名防封接口降低小说被封的风险
  • 类orAPI - 收藏集 - 掘金
  • 前端之Sass/Scss实战笔记
  • 巧用 TypeScript (一)
  • 问题之ssh中Host key verification failed的解决
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 最简单的无缝轮播
  • 【干货分享】dos命令大全
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • PostgreSQL之连接数修改
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • # windows 安装 mysql 显示 no packages found 解决方法
  • $.each()与$(selector).each()
  • (12)Linux 常见的三种进程状态
  • (19)夹钳(用于送货)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (过滤器)Filter和(监听器)listener
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (六)Hibernate的二级缓存
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (一)WLAN定义和基本架构转
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)四层和七层负载均衡的区别
  • (轉)JSON.stringify 语法实例讲解
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .helper勒索病毒的最新威胁:如何恢复您的数据?