theme: smartblue
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情。
最小差值 I
题目解析
题目素材解析
根据题目的描述,我们可以得知,会提供两个素材。
整数数组nums一个。
整数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,结果反而执行的更慢了。有大佬知道什么原因希望能解答一下我的疑惑。
Java代码本地执行
Java本地可调试代码,请参考github/Ijiran,可通过索引看到相应代码。