# 0910. Smallest Range II ###### tags: `Leetcode` `Medium` `Greedy` Link: https://leetcode.com/problems/smallest-range-ii/ ## 思路 思路参考[这里](https://leetcode.com/problems/smallest-range-ii/discuss/173389/simple-C%2B%2B-solution-with-explanation) 先sort array 原本的array是```nums[0], nums[1], ..., nums[n-1]``` greedy的思想我们会发现我们需要找一个分界点```i``` 让array变成```nums[0]+k, ..., nums[i]+k, nums[i+1]-k, ..., nums[n-1]-k```来获得最小的range (因为在左边随便挑一个值变成```nums[j]-k```或者```nums[j]```都可能使得答案变大) 对于```nums[0]+k, ..., nums[i]+k```, 最小值是```nums[0]+k```,最大值是```nums[i]+k``` 对于```nums[i+1]-k, ... , nums[n-1]-k```, 最小值是```nums[i+1]-k```,最大值是```nums[n-1]-k``` 所以我们在遍历的过程中比较两个最小值和两个最大值就能得到temp的答案 最后取最小值即可 ## Code ```python= class Solution: def smallestRangeII(self, nums: List[int], k: int) -> int: nums.sort() left = nums[0]+k right = nums[-1]-k ans = nums[-1]-nums[0] for i in range(len(nums)-1): minVal = min(left, nums[i+1]-k) maxVal = max(right, nums[i]+k) ans = min(ans, maxVal-minVal) return ans ``` ```java= class Solution { public int smallestRangeII(int[] nums, int k) { Arrays.sort(nums); int n = nums.length; int ans = nums[n-1]-nums[0]; int left = nums[0]+k; int right = nums[n-1]-k; for(int i=0; i<nums.length-1; i++){ int min = Math.min(left, nums[i+1]-k); int max = Math.max(right, nums[i]+k); ans = Math.min(max-min, ans); } return ans; } } ```