LeetCode刷题记录(二十八):最小差值 I


theme: smartblue

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情

最小差值 I

image.png

题目解析

题目素材解析

根据题目的描述,我们可以得知,会提供两个素材。

  1. 整数数组nums一个。

  2. 整数k。

注意:整数数组的长度在1到10000之间,其元素在0到10000之间,整数k值也在0到10000之间。

我的解读

首先要根据题目获知到预期结果。

如果你已经通读了一遍题目的话,就会得知,最后的预期结果是数组经过转换后最大值最小值的差

最重要的就是这个转换。

最大值和最小值的判断相信都没有问题。

那么数组的转换又是什么样子的呢?题目中的解释很官方,但不通俗。

我们通过给出的两个例子来理解题目的用意。

一、[0,10]; k = 2

如果没读明白这道题的话,一定就不知道为什么[0,10]要转换成[2,8]。

题目的意思是,你可以使用[-k, k]这个区间的值对数组中元素进行相加,但又不能重复加一个数;就比如数组中的0加了2,10就不能再加2了。

相加完成后,得到的数组再取最大值和最小值的差。

这里就有人很迷惑,照这样转换,最后的数组结果会很多,总不能把所有的情况穷举出来吧。

答案是不用的,因为如果想得到转换后的最小差值,只有一种情况,那就是原数组中的最小值加上k,最大值加上-k。

无须考虑其他值。

这也就说明了,为什么[0,10]要转换成[2,8]。

二、[1,3,6]; k = 3

为什么又给出了这个例子,是因为这是另外一种情况。

按照上面的说法,原数组中的最小值加上k,最大值加上-k。

最后得到的是4和3,这样的话得到的差值就是1;这里要注意,不会有负值的存在。

所以在这里要判断一下原数组中最大值和最小值的差值是不是比2k大。

如果比2k大,就是第一种情况,可以直接在原来差值基础上直接减去2k。

如果比2k小,就是第二种情况,可以直接返回0,因为只有0才是最小的。

解题思路

这道题找到规律就很简单了,实现起来的思路就不再说了。

代码

java class Solution { public int smallestRangeI(int[] nums, int k) { if(nums.length == 1){ return 0; } int min = nums[0]; int max = nums[0]; int result = 0; // for (int i = 1; i < nums.length; i++) { min = Math.min(min, nums[i]); max = Math.max(max, nums[i]); } // if(max - min <= k * 2){ return 0; }else{ result = max - min - k * 2; } return result; } }

执行结果

今天的题比较简单,找到规律,把代码写出来,一遍就过。

我尝试不声明result,直接return,结果反而执行的更慢了。有大佬知道什么原因希望能解答一下我的疑惑。

082b310915d31e12bae1bce447bb223.png

Java代码本地执行

Java本地可调试代码,请参考github/Ijiran,可通过索引看到相应代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ijiran

一杯咖啡太贵,一块糖就可以

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值