leetcode 910. 最小差值 II
阿新 • • 發佈:2018-12-12
題目:
給定一個整數陣列 A
,對於每個整數 A[i]
,我們可以選擇 x = -K
或是 x = K
,並將 x
加到 A[i]
中。
在此過程之後,我們得到一些陣列 B
。
返回 B
的最大值和 B
的最小值之間可能存在的最小差值。
思路:
首先排序,可以想到,大一些的估計都要-k,小一些的都要+k,但是這個分割點不好確定,所以迴圈遍歷查詢這個分割點就行。
然後需要注意的是,分割點找到之後需要再次確認最大值和最小值。
重點就在於確認變換之後的最大值和最小值。
程式碼:
class Solution { public: int smallestRangeII(vector<int>& A, int K) { int sz = A.size(); if(sz==1||sz==0)return 0; sort(A.begin(),A.end()); if(A[sz-1]-A[0]>=4*K)return A[sz-1]-A[0]-2*K; else { int ma = A[sz-1]-A[0]; for(int i=1;i<=sz-1;i++){ int mi = -1; int ab = min(A[i]-K,A[0]+K); int bb = max(A[i-1]+K,A[sz-1]-K); mi = max(mi,bb-ab); ma = min(ma,mi); } ma = min(ma,A[sz-1]-A[0]); return ma; } return 0; } };
最大值和最小值大於4*K的話是一種特殊情況。
精簡程式碼:
class Solution { public: int smallestRangeII(vector<int>& A, int K) { sort(A.begin(),A.end()); int n=A.size(),i,ans=A.back()-A.front(); for(i=0;i+1<n;i++)ans=min(ans,max(A[i]+K,A[n-1]-K)-min(A[0]+K,A[i+1]-K)); return ans; } };
這程式碼寫的。。。