差分陣列 LeetCode1674

2021-10-11 13:49:33 字數 1777 閱讀 3843

差分陣列是原陣列相鄰兩數的差值構成的陣列。利用差分陣列,可以快速地實現對區間內所有數同時加(減)去某個數。這是因為差分陣列維護是原陣列的變化量,在每次同時加(減)操作之後,除了差分陣列兩端的值會發生變化,差分陣列內部的值保持不變。引用一位大神部落格中的例子具體說明:

原始陣列和差分陣列

將區間[1,4]中元素同時+3

這時我們就會發現這樣乙個規律,當對乙個區間進行增減某個值的時候,他的差分陣列對應的區間左端點的值會同步變化,而他的右端點的後乙個值則會相反地變化,其實這個很好理解。

給你乙個長度為偶數n 的整數陣列 nums 和乙個整數 limit 。每一次操作,你可以將 nums 中的任何整數替換為 1 到 limit 之間的另乙個整數。

如果對於所有下標 i(下標從 0 開始),nums[i] + nums[n - 1 - i] 都等於同乙個數,則陣列 nums 是 互補的 。例如,陣列 [1,2,3,4] 是互補的,因為對於所有下標 i ,nums[i] + nums[n - 1 - i] = 5 。

返回使陣列互補最少操作次數。

示例 1:

輸入:nums = [1,2,4,3], limit = 4

輸出:1

解釋:經過 1 次操作,你可以將陣列 nums 變成 [1,2,2,3]

由已知條件可知,互補的兩數之和s = nums[i]+nums[n-1-i]滿足條件2 ≤

\leq

≤ s ≤

\leq

≤ 2*limit,因此只需將[2, 2*limit]中的每乙個數作為互補和求出對應的操作次數,取最小值即可。

對於每一對a = nums[i]和b = nums[n-1-i],要是它們互補,需要的操作次數可能為2、1、0。當 a+b == s時,操作次數為0;當 1+min(a,b) <= s <= limit+max(a,b)時,操作次數為1(只需換乙個);當 2 <= s <= 2*limit時,操作次數為2(兩個都要換)。

通過以上分析,可以通過構造差分陣列times[2*limit+2]來完成對區間的同時操作,times[i]在差分陣列的原陣列中表示將i當作互補和時對應的操作次數。具體演算法:遍歷陣列nums,對於每一對a和b,

將區間[2, 2*limit]的數都+2,對應於2個操作次數,

將區間[1+min(a,b), limit+max(a,b)]的數都-1,對應於1個操作次數,

將區間[a+b, a+b]的數都-1,對應於0個操作次數,

最後將差分陣列恢復成原陣列,取最小值即可。演算法的時間複雜度為o(n

)o(n)

o(n)

class

solution

//將差分陣列恢復成原陣列,最小值為答案

for(

int i =

2; i <=

2*limit; i++

)return ans;}}

;

[1]

[2]

leetcode 167周賽題解

class solution return ans class solution def getdecimalvalue self,head ans 0while head none ans ans 2 head.val head head.next return ansclass solution...

LeetCode 167 兩數之和

給定乙個已按照公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。說明 返回的下標值 index1 和 index2 不是從零開始的。你可以假設每個輸入只對應唯一的答案,而且你不可以重複使...

leetcode 167 兩數求和

方法二.二分查詢 給定乙個已按照 公升序排列 的整數陣列 numbers 請你從陣列中找出兩個數滿足相加之和等於目標數 target 函式應該以長度為 2 的整數陣列的形式返回這兩個數的下標值。numbers 的下標 從 1 開始計數 所以答案陣列應當滿足 1 answer 0 answer 1 n...