java数据结构与算法刷题-----LeetCode1005. K 次取反后最大化的数组和(这就不是简单题)

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

卷来卷去,把简单题都卷成中等题了

文章目录

    • 1. 排序后从小到大取负
    • 2. hash表从小到大排序,省掉排序(这就是为什么这题不是简单题)

在这里插入图片描述

1. 排序后从小到大取负

解题思路:时间复杂度O( n ∗ l o g 2 n n*log_{2}n nlog2n),时间复杂度的大头就是排序算法. 空间复杂度O( l o g 2 n log_{2}n log2n),快速排序算法需要栈空间

将数组排序后,从小到大取负即可

代码

在这里插入图片描述

class Solution {public int largestSumAfterKNegations(int[] nums, int k) {// 排序,把可能有的负数排到前面Arrays.sort(nums);int sum = 0;for (int i = 0; i < nums.length; i++) {// 贪心:如果是负数,而k还有盈余,就把负数反过来if (nums[i] < 0 && k > 0) {nums[i] = -1 * nums[i];k--;}sum += nums[i];}Arrays.sort(nums);// 如果k没剩,那说明能转的负数都转正了,已经是最大和,返回sum// 如果k有剩,说明负数已经全部转正,所以如果k还剩偶数个就自己抵消掉,不用删减,如果k还剩奇数个就减掉2倍最小正数。return sum - (k % 2 == 0 ? 0 : 2 * nums[0]); }
}

2. hash表从小到大排序,省掉排序(这就是为什么这题不是简单题)

上面方法一,排序浪费了大量时间,这个方法,将排序的时间省下来了 , 一举将这道简单题,升为中等难度的题。

解题思路:时间复杂度O( n + c n+c n+c),n是数组长度,c是数组中元素的取值范围. 空间复杂度O( C C C)
  1. 先将数组所有数字放入hash表统计其在数组中出现的次数,并且统计数组的所有元素和sum
  2. 然后从小到大依次对hash表中的负数取负(因为是负数,越小,取负后就越大。比如-100 和0 ,明显-100更小,但是取负后,变为100和0,100反而更大)
  3. 共取负k次,取负的过程中,修改sum的值,如何修改呢?这个是个固定套路。

将sum中的某一个负数(-x)改为正数(x),需要加两倍的x. 例如5 + (-1) = 4 , -1取负后结果为 5 + 1 = 6; ==> 4 + 1*2 = 6。也就是sum + (-x) = newSum, 取负 newSum + 2 * x = newNewSum

  1. 此时如果所有负数都取负完成,k依然没有归0,说明我们还需要继续取负。此时剩余的数字都是正数,所以我们对最小的数字取负即可。有以下两种情况
  1. 剩余k为偶数,因为-(-1) = 1.也就是对一个正数x取负偶数次,结果依然是x
  2. 剩余k为奇数,因为奇数-1为偶数。也就是我们对正数x先取负偶数次,结果依然是x次,然后再对其取负1次即可。简单来说,对剩余数字中最小的取负一次,然后对sum处理即可
  3. 注意:对一个sum中的一个正数取负,需要减去两个它。注意和上面将sum中一个负数取负区分。
代码
  1. 使用数组充当hash表的效率
    在这里插入图片描述
  2. 使用HashMap的效率(所以不使用这种方法,从而将这道题的难度又提升了一些)
    在这里插入图片描述

代码中的细节:普通使用hash表的效率很低,所以这道题想要超越100%的用户,需要使用数组充当hash表,这也是为什么这道题不是简单题的原因(新手很难转过来这个弯)

  1. 用数组充当hash表,因为题目所给取值范围为[-100 , 100],所以我们需要一个大小为201的数组充当hash表。也可以直接用HashMap(但是对于做题来说,效率就慢了)
  2. hash数组下标从0开始,则下标0代表-100.下标1代表-99,…,下标100代表0,…,下标200代表100
  3. 对于一个数字i来说,需要+100才是hash数组中对应的位置,因为-100+100 = 0,正好存在hash[0]的位置
  4. 既然hash[100]代表数字0,那么hash[100] 保存正数 hash[200]
  5. 对于一个负数来说,对其取负后,他变为正数,应该存放到hash[200-i]的位置,例如-100取负为100,-100原本在hash[0],则 i = 0. 此时变成正数后,应该存放到hash[200]. 也就是hash[200-(0)] ==>hash[200]
class Solution {public int largestSumAfterKNegations(int[] nums, int k) {int[] arr = new int[201];//hash表,这道题的范围是-100到100,正好需要201个位置存储。下标0表示-100int sum = 0;//保存当前nums数组的和for(int n : nums){arr[n+100]++;//统计元素出现次数sum += n;//统计当前所有元素的和}for(int i = 0; i < 100 && k > 0; i++){//从小到大遍历hash表中的负数if(arr[i] != 0){//如果当前数字还有剩余//如果当前数字i出现次数 < k ,则获取i的出现次数//如果当前数字i的出现次数 > k, 则获取k,表示剩余可以取负的次数int min = Math.min(arr[i],k);//获取当前数字的出现次数和k,较小的一个k -= min;//对当前数字i,每一个都取负,k表示可取负的次数,需要对min个i取负//负数取负后,变为正数,i = 0表示的是-100,取负变为100,应该存储在i = 200的位置,//i = 200表示的是正100arr[200-i] += min;//对min个i取负,则变为min个正i。存放到相应位置//5 + (-1) = 4 , 5 + 1 = 6; ==> 4 + 1*2 = 6 //sum + (-x) = newSum, 取负 newSum + 2 * x = newNewSum//当一个和的结果中,将一个负数取负后,需要加上两个它哦//我们这里只将负数转为正数,例如将i(0<=i<100)转为正数,是200-i//但是因为sum中取负某个负数i后,需要加上两个i,因此是200-2*i//我们一共取负了min个i,故需要(200-2*i) * minsum += (200-2*i)*min;}}//如果所有负数全部取负后,k还是没有归0,也就是我们必须继续对数字取负//因为k剩偶数个时,我们对同一个取负,结果不变,例如x取负两次,-(-x) = x//如果k还剩奇数个,就需要对某个数继续取负一次,因为 奇数 减去 1 为偶数,偶数次取负,原值不变,则剩一次需要取负if(k % 2 != 0){for(int i = 100; i <= 200; i++){//因为没有负数了,则对现存最小的数字取反一次即可if(arr[i] != 0){//如果当前数字存在sum -= (i-100)*2;//对其取负,对一个sum中的一个正数取负,需要减去两个它return sum;//返回最终结果}}}return sum;//如果在负数全部取负之前(正好全取负完)k就归0了,直接返回sum即可}
}

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

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

相关文章

Spring Boot 实现程序的优雅退出

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 前言 优雅停机是什么 SpringBoot如何实现优雅停机 合理杀死进程 法一&…

SQLiteC/C++接口详细介绍之sqlite3类(十八)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十七&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;一&#xff09; ​ 56.sqlite3_update_hook 函数功能&am…

C++面试宝典第36题:骑士游历

题目 在国际象棋的棋盘上,使一个骑士遍历所有的格子一遍且仅一遍。对于任意给定的顶点,输出一条符合上述要求的路径。骑士的走法和中国象棋的马的走法一样,走日。 解析 本题是一个经典的回溯搜索问题,具体来说是求解国际象棋棋盘上骑士的遍历问题,也称为骑士巡游问题(Kni…

【研发日记】Matlab/Simulink技能解锁(四)——在Simulink Debugger窗口调试

文章目录 前言 Block断点 分解Block步进 Watch Data Value 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑窗口Debug》 见《【研发日记】Matlab/Simul…

信驰达车规蓝牙模块RF-BM-2642QB1I赋能汽车T-Box

近年来&#xff0c;随着人们对数据传输需求的增长&#xff0c;传统网络布线的通讯方式逐渐显现出满足不了的局限性&#xff0c;与此同时&#xff0c;各种无线传输技术迅速发展。汽车工业同样需要无线通讯技术&#xff0c;但红外技术、802.11、HomeRF等技术在汽车工业中存在一定…

文献速递:深度学习乳腺癌诊断---使用深度学习改善乳腺癌诊断的MRI技术

Title 题目 Improving breast cancer diagnostics with deep learning for MRI 使用深度学习改善乳腺癌诊断的MRI技术 01 文献速递介绍 乳腺磁共振成像&#xff08;MRI&#xff09;是一种高度敏感的检测乳腺癌的方式&#xff0c;报道的敏感性超过80%。传统上&#xff0c;其…

医药工厂5G智能制造数字孪生可视化平台,推进医药企业数字化转型

医药工厂5G智能制造数字孪生可视化平台&#xff0c;推进医药企业数字化转型。随着科技的不断发展&#xff0c;数字化转型已成为医药企业不可或缺的一部分。5G智能制造医药工厂数字孪生可视化平台作为数字化转型的重要工具&#xff0c;正在逐步改变医药企业的生产方式和管理模式…

软考真题详解-系统架构设计师-计算机基础知识(1)

题目1&#xff1a;计算机系统中硬件层之上的软件通常按照三层来划分&#xff0c;如下图所示&#xff0c;图中①②③分别表示&#xff08;1&#xff09;。 A.操作系统、应用软件和其他系统软件 B.操作系统、其他系统软件和应用软件 C.其他系统软件、操作系统和应用软件 D.应…

中国银行信息系统应用架构发展历程

概述&#xff1a; 从 20 世纪 80 年代开始至今&#xff0c;我国银行业信息化历程已 有四十年历史。虽然相对于发达国家来讲&#xff0c;我国银行业务信 息化起步较晚&#xff0c;但发展速度很快&#xff0c; 目前我国一些大型商业银行的信息化程度已经处于全球领先水平。 “银行…

Python Web开发记录 Day13:Django part7 Ajax入门与案例(任务管理)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、Ajax入门①简介②工作原理③优点④缺点⑤使用…

操作系统知识-操作系统作用+进程管理-嵌入式系统设计师备考笔记

0、前言 本专栏为个人备考软考嵌入式系统设计师的复习笔记&#xff0c;未经本人许可&#xff0c;请勿转载&#xff0c;如发现本笔记内容的错误还望各位不吝赐教&#xff08;笔记内容可能有误怕产生错误引导&#xff09;。 本章的主要内容见下图&#xff1a; 1、操作系统的作用…

c++类和对象(二)

c类和对象&#xff08;二&#xff09; 1.类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 赋值运算符重载 6. const成员函数 7. 取地址及const取地址操作符重载 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都…

python中如何解析Html

在最近需要的需求中&#xff0c;需要 python 获取网页内容&#xff0c;并从html中获取到想要的内容。这里记录一下两个比较常用的python库对html的解析。 1. BeautifulSoup 它是一个非常流行的python脚本库&#xff0c;用于解析HTML和XML文档。如果你对 java 很熟悉&#xff…

关于Zookeeper分布式锁

背景 之前说到分布式锁的实现有三种 1、基于数据库实现的分布式锁 2、Redis分布式锁 3、Zookeeper分布式锁 前者redis分布式锁博客已具体介绍&#xff0c;此博客最终决定补齐关于Zookeeper分布式锁的实现原理。 简述 Zoopkeeper&#xff0c;它是一个为分布式的协调服务&…

C#,图论与图算法,图(Graph)广度优先遍历(BFS,Breadth First Search)算法与源代码

1 深度优先算法与 宽度优先遍历 深度优先算法(DFS,Deep First Search)与 宽度优先遍历(BFS,Breadth First Search) 是树、图数据结构的基础性、标准性的遍历算法。 2 深度优先算法(DFS,Deep First Search) 深度优先搜索(DFS)是一种用于搜索图形或树数据结构的算法…

Kafka:分布式消息队列

1. 简介 介绍 Kafka 的概述、优势和劣势&#xff0c;以及应用场景。 2. 基本概念 2.1 架构 一个典型的 Kafka 体系架构包括若干 Producer、若干Broker、若干 Consumer&#xff0c;以及一个ZooKeeper集群。 ZooKeeper是Kafka用来负责集群元数据的管理、控制器的选举等操作的…

本地虚拟机平台Proxmox VE结合Cpolar内网穿透实现公网远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

Selenium 自动化 —— Selenium IDE录制、回放、导出Java源码

Hello Selenium 示例 之前我们在专栏的第一篇文章中演示了使用使用Selenium进行百度搜索的Hello world示例。 代码不复杂非常简单&#xff1a; public static void main(String[] args) {WebDriver driver null;try {// 设置Chrome驱动的路径 // System.setPro…

Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验(后记)

2024.03.05&#xff1a; 测试了开发板网线直连电脑可以传输数据。但是通过开发板→交换机→电脑&#xff0c;没有数据传输。通讯采用UDP通讯&#xff0c;一个是无法满足后续对采集数据的傅里叶变换和傅里叶逆变换的处理。二是无法通过交换机传输数据。 2024.03.07&#xff1a…

YoloV8改进策略:Block改进|焦点调制网络

摘要 FocalNets是一个新型的神经网络架构&#xff0c;它的核心特点是用焦点调制模块完全取代了自注意力&#xff08;SA&#xff09;机制&#xff0c;用于在视觉任务中建模令牌&#xff08;token&#xff09;之间的交互。这种架构的设计旨在提高模型的可解释性&#xff0c;并在…