贪心算法day03

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

本题简单一些,估计大家不用想着贪心 ,用自己直觉也会有思路。 

代码随想录

给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)

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

看到题目的第一想法

观察,排序,将所有的负数都转成正的

若K还有遗留,则将最小的值,反复取负

看到代码随想录之后的想法

     代码随想录:按照绝对值排序

用stream来排序的代码

nums = IntStream.of(nums)
             .boxed()
             .sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))
             .mapToInt(Integer::intValue).toArray();

计算数组的总和

Arrays.stream(nums).sum();

自己实现过程中遇到的困难

       我的实现比较繁琐用了两次排序,需要记住这种转成负数的办法

class Solution {/*public int largestSumAfterKNegations(int[] nums, int k) {//用贪心  局部和整体//K次,先把所有的负数转为正数//返回的是值可以排序Arrays.sort(nums);//把所有的负数转为正数int sum=0;for(int i=0;i<nums.length;i++){if(nums[i]<0&&k>0){nums[i] = -nums[i];k--;}sum+=nums[i];}if(k==0){return sum;}//都为正数了且K>0if(k%2==0){return sum;}Arrays.sort(nums);return sum-(nums[0]*2);}*/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++) {//从前向后遍历,遇到负数将其变为正数,同时K--if (nums[i] < 0 && K > 0) {nums[i] = -nums[i];K--;}}// 如果K还大于0,那么反复转变数值最小的元素,将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] 升。你从其中的一个加油站出发,开始时油箱为空。

如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1

看到题目的第一想法

使用暴力算法,gast和cost同时遍历,获得gast[i]-cost[i]的值,若为负数 则break

看到代码随想录之后的想法

暴力算法:为负数不用break,可以在最后进行判断,while(sum>=0&&j%5!=i) while加上个sum>=0的条件

看最后是否满足while跳出条件,也就是 sum>=0&j%5==i,如果满足即可,能把while 走完

贪心的做法:三个参数 start curNum totalNum

若局部的curNum为负数了,则令curNum=0,start为下一个下标重新开始记录

使用一个curNum 和一个totalNum ,totalNum记录每一次gast[i]-cost[i]的和加起来

而curNum记录当前gast[i]-cost[i]的和加起来

若totalNum<0 则不存在 返回-1

若totalNum>=0 则存在该节点,返回curNum计数的起始位置,前面为负的起始位置都给排除了

自己实现过程中遇到的困难

       //暴力算法中for循环里面加while的操作可以再熟悉一下

        能把终止的点加在while的条件中,而不用在while中break;其余的判断在while之后即可

      1 记录每一个差值,如果总和差值为负数,则不存在
      2 局部最优,若当前的差值和为负,那么就从差值和的下一个来判断是否可行
      3 全局最优,如果当前差值和一直到最后都不为负数,而总差值和>=0 则一定存在对应下标,在非负的差值和的第一个下标开始

class Solution {
/*    public int canCompleteCircuit(int[] gas, int[] cost) {int len = gas.length;for(int i=0;i<gas.length;i++){int sum = 0;//从i开始 到i这个位置该怎么算呢?sum = gas[i]-cost[i];int j = (i+1)%len;while(j%len!=i){if(sum+gas[j]-cost[j]>=0){sum+=gas[j]-cost[j];}else{break;}j=((j+1))%len;if(j%len==i){return j;}}}return -1;}*///暴力解法,数组中每个元素都进行循环,判断是否满足一次//需要注意这种最后一次return的方法,我的return太复杂,其实只要在最后看是否满足while条件就行了/*  public int canCompleteCircuit(int[] gas, int[] cost) {int len = gas.length;for(int i=0;i<gas.length;i++){int j = (i+1)%len;int sum = gas[i]-cost[i];//从i开始 到i这个位置该怎么算呢?while(sum>0&&j%len!=i){sum+=gas[j]-cost[j];j=(j+1)%len;}//这样处理是可以的if(sum>=0&&j%len==i){return j;}}return -1;}*///代码随想录贪心的逻辑:需要观察出,总差值和若为负数则不存在这种回路//1 记录每一个差值,如果总和差值为负数,则不存在//2 局部最优,若当前的差值和为负,那么就从差值和的下一个来判断是否可行//3 全局最优,如果当前差值和一直到最后都不为负数,而总差值和>=0 则一定存在对应下标,在非负的差值和的第一个下标开始public int canCompleteCircuit(int[] gas, int[] cost) {//差值和int curSum = 0;//总的差值和int totalSum = 0;//起始下标int start = 0;for(int i=0;i<gas.length;i++){curSum += gas[i]-cost[i];totalSum += gas[i] - cost[i];if(curSum<0){start=i+1;curSum = 0;}}//若总差值和<0 则不存在if(totalSum<0) return -1;return start;}
}

  135. 分发糖果 

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

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

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

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

本题涉及到一个思想,就是想处理好一边再处理另一边,不要两边想着一起兼顾,后面还会有题目用到这个思路 

代码随想录

看到题目的第一想法

想着和之前求摆动序列的思路,用一个pre和cur,其实完全不一样

没有思路

看到代码随想录之后的想法

两次贪心,先处理从左到右的结果

再处理从右到左的结果

要看相邻孩子

用一个数组存放每次贪心的结果

先处理左边<右边:从第二个开始若左边<右边则记录在新数组中为

                             右边的元素值=左边的元素值+1

再处理右边<左边 从倒数第二个元素开始,若右边<左边,则

                              左边的元素=Max(右边的元素值+1,数组中原有的元素值)

自己实现过程中遇到的困难

        从左到右赋值问题 与前一个比较,填充在当前位置

        为什么第二次要从右到左,需要的是右边的结果,i依赖于i+1 的内容,所有要从i+1 往前遍历

    • 题目的要求是 相邻的孩子中,评分高的孩子必须获得更多的糖果;所以第一次是保证了 只要右边评分比左边大,右边的孩子就多一个糖果 ,所以第二次应该是从后往前遍历,保证 只要左边评分比右边大,左边的孩子就多一个糖果
    • 如果从前向后遍历,每次只会更新i,这个结果是依据i+1的,但是下次i+1也会更新 ,这个操作就会使得答案有问题
    • 然而如果是从后向前,那么左边比右边大则左边糖果为右边+1,这时候的右边就是第一次从前往后遍历后保证的结果

        

具体看注释

class Solution {public int candy(int[] ratings) {//我没找到思路//先找到最小的糖果,来左右判断,有点混乱//if(ratings[i-1]){//}//卡哥思路//两次贪心,先把左边<右边的处理好,再把右边<左边的处理好//存储好局部的值//先处理从左往右进行判断的最小糖果数量 统计下来 右边小于左边//再处理从右往左进行判断的糖果数量,左边小于右边,与之前统计下来的结果做一个比较,两者中取比较大的那个//有个疑惑:第二次统计会破坏第一次的结果吗?//不会破坏,因为第二次统计后,只会取两者中更大的那个//将两者中统计下来的值的总和加起来返回int candy[] = new int[ratings.length];for(int i=0;i<candy.length;i++){candy[i]=1;}//看右>左//注意赋值的是前一个元素的值+1for(int i=1;i<ratings.length;i++){if(ratings[i]>ratings[i-1]){candy[i] = candy[i-1]+1;}}//看左>右//注意赋值的是前一个元素的值+1//同时是两者中的最大值,两者中取最大的,代表只会去到比之前的大或者相等的,满足糖果最大数量for(int i=ratings.length-2;i>=0;i--){if(ratings[i]>ratings[i+1]){candy[i] = Math.max(candy[i],candy[i+1]+1);}}int result = 0;for(int i:candy){result+=i;}return result;}
}
返

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

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

相关文章

Linux进程管理和计划任务

前言 上篇关于进程管理命令使用说明尚未完结&#xff0c;本篇将继续介绍相关命令以及计划任务管理。 目录 前言 一、控制进程 1. vmstat 2. free 3. iostat 4. iotop/iftop 5. uptime 6. mpstat 7. dstat 8. webadin 9. 服务器五大性能 二、进程管理 1. 手动…

跨国公司为什么要部署SD-WAN

随着全球化进一步加深&#xff0c;越来越多的企业开始实施跨国战略&#xff0c;但要在各个地区建立分支机构、数据中心&#xff0c;跨国企业可能会遇到各地区之间网络性能差异大、导致数据传输效率低下的问题&#xff0c;而且由于网络场景复杂&#xff0c;网络设备和运维成本高…

Django 6 后台与便签

1. 什么是后台管理 后台管理是网页管理员利用网页的后台程序管理和更新网站上网页的内容。各网站里网页内容更新就是通过网站管理员通过后台管理更新的。 2. 创建超级用户 1. python .\manage.py createsuperuser 2. 输入账号密码等信息 Username (leave blank to use syl…

【一】CocosCreator引擎启动流程

游戏的入口函数就是在main.js&#xff0c;main.js文件内部会调用一个window.boot(),而此方法主要是加载启动场景所需要的东西&#xff0c;如&#xff1a;cc.assetManager.init(...)&#xff1a;初始化 AssetManagercc.assetManager.loadScript(...)&#xff1a;加载 src 目录下…

对图片进行数据增强(基于pytorch)

背景 在进行机器学习的任务中&#xff0c;我们的训练数据往往是有限的&#xff0c;在有限的数据集上获得较好的模型训练结果&#xff0c;我们不仅要在模型结构上下功夫&#xff0c;另一方面也需要对数据集进行数据增强 图片数据增强 图像数据增强是一种在训练机器学习和深度学…

计算化学顶刊封面!玻色量子联合上海交大张健课题组发表量子计算重要成果

​2023年12月13日&#xff0c;北京玻色量子科技有限公司&#xff08;以下简称“玻色量子”&#xff09;联合上海交通大学在中科院分区1区、计算化学领域Top刊物JCTC&#xff08;Journal of Chemical Theory and Computation&#xff09;内刊的封面上发表了以“Encoding Molecul…

【ceph】使用 upmap 在 OSD 上手动重新平衡数据,比前面用reweight、balance香多了

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

国内CRM系统哪个品牌比较好?

国内CRM系统哪个品牌比较好? 作为简道云第一个以“独立套件”开发出来的业务系统&#xff0c;对于简道云CRM我从来都是“昂首挺胸”的骄傲和自豪的&#xff01; 下面就从功能、价格、自定义3大块儿来介绍下简道云CRM管理系统&#xff01; CRM管理系统&#xff0c;即开即用​…

单位转换工具类

单位转换工具类 1. 工具类转换- 定义装换枚举转换类型- 创建转换工具类,1. 通过反射去除字段,2.对照传入map标记的字段需要转换的类型转换3. 重新赋值 2. 注解转换- 定义注解- 解析注解 1. 工具类转换 - 定义装换枚举转换类型 public enum UnitConvertType {/*** 精确度*/ACC…

【AI】使用LoFTR进行图像匹配测试Demo

LoFTR图像匹配的源码解析我们在上篇文章中已经写了&#xff0c;对于怎么试用一下&#xff0c;我这边再啰嗦一下。 0.环境搭建 详细的搭建教程请点击链接查看&#xff0c;这里只对需要特殊注意的地方做阐述 1.创建的Python环境采用python3.8的环境&#xff0c;因为文章发布较早…

性价比window+Linux二合一主机

一边学习,一边总结,一边分享! 写在前面 我在2023年12月组了一台“洋垃圾”的主机,一边当做台式机使用,一边当做服务器使用。这个方案算是相对比较划算的方案。我开始是打算直接单做服务器使用的,以及内存配的很高,但是后面和同事一起商量后,还是接受了后面的方案。大…

来自云仓酒庄分享为什么同一种葡萄会使用不同的名称?

如果你只是刚刚走进葡萄酒世界&#xff0c;走在葡萄酒通道上可能会令人生畏&#xff0c;因为有不同的国家、地区和生产商&#xff0c;除此之外还有数千酿酒葡萄品种。更令人困惑的是&#xff0c;有些地方对同一种葡萄使用不同的名称&#xff01;一个著名的例子是西拉和它澳大利…

2下载Spring,第一个Spring程序+Log4j

https://www.yuque.com/dujubin/ltckqu/kipzgd#&#xff0c;注意的是&#xff0c;现在&#xff08;202401&#xff09;SpringFramework从release搬到了snapshot下&#xff0c;在这下面找到6.0.2下载. 下载后解压到文件夹&#xff0c;整个框架包含非常多jar包。 然后就可以在p…

工业物联网中的网络建设是如何实现的?——青创智通工业物联网

在工业物联网的应用中&#xff0c;如何进行网络建设&#xff0c;对于青创智通工业物联网来说&#xff0c;车间内所有装备均可通过与OPC UA网关连接实现数据采集&#xff0c;OPC UA网关实现Modbus协议、DLT645协议、BACnet协议、CJ188协议、三菱协议、西门子协议、Mbus协议。 通…

信号强度功能 界面、逻辑和图标(免费)

信号强度 需求 vue项目&#xff0c;需要实时监控系统信号&#xff0c;要求&#xff1a; 1.共五格信号&#xff1b; 2.信号0-100为满值&#xff0c;信号100-500为四格&#xff0c;信号500-1000为三格&#xff0c;信号1000-5000为两格&#xff0c;信号5000-20000为一格&#x…

Spring Boot 完善订单【五】集成接入支付宝沙箱支付

1.1.什么是沙箱支付 支付宝沙箱支付&#xff08;Alipay Sandbox Payment&#xff09;是支付宝提供的一个模拟支付环境&#xff0c;用于开发和测试支付宝支付功能的开发者工具。在真实的支付宝环境中进行支付开发和测试可能涉及真实资金和真实用户账户&#xff0c;而沙箱环境则提…

快速搭建知识付费平台?明理信息科技,为你提供一站式解决方案

明理信息科技知识付费saas租户平台 在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和…

Time-series forecasting with deep learning: a survey

人们开发了许多深度学习架构来适应不同领域的时间序列数据集的多样性。在本文中&#xff0c;我们调查了一步前进和多水平时间序列预测中使用的常见编码器和解码器设计&#xff0c;描述了如何将时间信息纳入每个模型的预测中。接下来&#xff0c;我们重点介绍混合深度学习模型的…

Kubernets(K8S)启动和运行 01-02 Kubernetes的速度非常快

Kubernetes的速度非常快 简介&#xff08;Intoduction&#xff09; Velocity is the key component in nearly all software development today. The software industry has evolved from shipping products as boxed CDs or DVDs to software that is delivered over the ne…

计算机组成原理-输入输出系统和IO控制方式

文章目录 总览现代计算机的结构常见的IO设备主机如何与IO设备交互IO控制方式简介程序查询方式程序中断方式DMA控制方式通道控制方式 IO系统基本组成小结 总览 现代计算机的结构 常见的IO设备 主机如何与IO设备交互 IO控制方式简介 数据寄存器&#xff1a;存放主机要输出到外设…