问题描述:
给定一个整数数组A
,对于每个整数A[i]
,我们可以选择x = -K
或是x = K
,并将x
加到A[i]
中。
在此过程之后,我们得到一些数组B
。
返回 B
的最大值和B
的最小值之间可能存在的最小差值。
示例 :
输入:A = [1,3,6], K = 3
输出:3
解释:B = [4,6,3]
提示:
1 <= A.length <= 10000
0 <= A[i] <= 10000
0 <= K <= 10000
问题分析:
这个题目还是比较有意思的,看了评论才搞明白,排序,然后线性扫描就可以得出结果。
(1)先有这样一个知识,假设a < b
,那么[a + k, b - k]
,一定是[a - k, b + k]
的一个子集,后面的计算,就可以在[a + k, b - k]
区间里面寻找了。
(2)首先对整个数组从小到大排序,方便后面计算,并且确定一个上界 res = A[-1] - A[0]
(其中这个上界,包含了两个数同时加上或者减轻 K
的情况)。
(3)排序后,来看一种情况,假设数组A
在i
处被分割为两部分[ A[1], A[2], A[3]... A[i] ]
、[ A[i+1], A[i+2], A[i+3]... A[n-1] ]
现在可以把这两部分,看成两个值,然后考虑(1)中的情况,遍历选出最优的结果。如果说存在贪心思想,感觉,在选取i
的情况下,可以说是贪心的选取得。
Python3实现:
class Solution:
def smallestRangeII(self, A, K):
A.sort()
res = A[-1] - A[0]
for i in range(len(A) - 1):
left = min(A[0] + K, A[i + 1] - K)
right = max(A[i] + K, A[-1] - K)
res = min(res, right - left)
return res
if __name__ == '__main__':
solu = Solution()
A, K = [1, 3, 6], 3
A, K = [3, 3], 3
print(solu.smallestRangeII(A, K))
声明: 总结学习,有问题可以批评指正,大神可以略过哦
题目连接:leetcode-cn.com/problems/smallest-range-ii/description/
参考连接:leetcode.com/problems/smallest-range-ii/discuss/173389/simple-C%2B%2B-solution-with-explanation