題目描述:
給你乙個按非遞減順序排序的整數陣列nums
,返回每個數字的平方組成的新陣列,要求也按非遞減順序排序。
示例 1:
輸入:nums = [-4,-1,0,3,10]
輸出:[0,1,9,16,100]
解釋:平方後,陣列變為 [16,1,0,9,100]
排序後,陣列變為 [0,1,9,16,100]
示例 2:
輸入:nums = [-7,-3,2,3,11]
輸出:[4,9,9,49,121]
解法1:#直接排序
class solution:
def sortedsquares(self, nums: list[int]) -> list[int]:
return sorted(num * num for num in nums)
這是最簡單,**量最少的一種解法,直接將nums中的數平方後直接排序。但是沒有用到這一條件:給定的陣列是按照非遞減順序。
解法2:
#雙指標
lass solution:
def sortedsquares(self, nums: list[int]) -> list[int]:
n=len(nums)
ans=[0]*n
i,j,pos=0,n-1,n-1
while i<=j:
if nums[i]*nums[i]>nums[j]*nums[j]:
ans[pos]=nums[i]*nums[i]
i+=1
else:
ans[pos]=nums[j]*nums[j]
j-=1
pos-=1
return ans
可以使用雙指標分別指向0,n-1,每次比較兩個指標對應的數,選擇較大的那個逆序(或者選擇較小的那個順序也行)放入答案並移動指標,同時,這種方法也無需處理某一指標移動至邊界的情況。
解法3(超時?):#雙指標、歸併排序
class solution:
def sortedsquares(self, nums: list[int]) -> list[int]:
n = len(nums)
negative = -1
#python的變數不用宣告,i,num用於記錄python內建函式
#enumerate的返回,即列表nums的下標和下標對應的數值
for i, num in enumerate(nums):
if num<0:
negative=i
else:
break
ans=list()
#nums[0]到nums[i]均為負數
#nums[j]到nums[n-1]均為正數
i,j=negative,negative+1
#當指標移至邊界時,將另一指標還未遍歷到的數依次放入答案
while i>=0 or j方法一沒有利用(陣列nums已經按照公升序排序)這個條件,顯然,如果陣列nums中的所有數都是非負數,那麼將每個數平方之後,陣列仍然保持公升序;如果陣列nums中的所有數都是負數,那麼將每個數平方之後,陣列仍然保持降序。
這樣一來,如果我們能夠找到陣列nums中負數與非負數的分界線,那麼就可以用類似歸併排序的方法,具體的,我們可以設定乙個變數negative,作為負數與非負數的分界線,也就是說,nums[0]到nums[negative]均為負數,nums[negative+1]到num[n-1]均為非負數。當我們對陣列中的數進行平方操作後,那麼nums[0]到nums[negative]單調遞減,nums[negative+1]到nums[n-1]單調遞增。
由於我們已經得到了兩個已經有序的子陣列,因此就可以使用歸併的方法進行排序。具體地,使用兩個指標分別指向negative和negative+1,每次比較兩個指針對用的數,選擇較小的那個放入答案並移動指標,當某一指標移至邊界時,將另一指標還未遍歷到的數依次放入答案。
leetcode 977 有序陣列的平方
給定乙個按非遞減順序排序的整數陣列a,返回每個數字的平方組成的新陣列,要求也按非遞減順序排序。示例 1 輸入 4,1,0,3,10 輸出 0,1,9,16,100 示例 2 輸入 7,3,2,3,11 輸出 4,9,9,49,121 1 a.length 10000 10000 a i 10000a...
LeetCode977 有序陣列的平方
給定乙個按非遞減順序排序的整數陣列a,返回每個數字的平方組成的新陣列,要求也按非遞減順序排序。示例 1 輸入 4,1,0,3,10 輸出 0,1,9,16,100 示例 2 輸入 7,3,2,3,11 輸出 4,9,9,49,121 1 a.length 10000 10000 a i 10000a...
leetcode 977 有序陣列的平方
給定乙個按非遞減順序排序的整數陣列 a,返回每個數字的平方組成的新陣列,要求也按非遞減順序排序。示例 1 輸入 4,1,0,3,10 輸出 0,1,9,16,100 示例 2 輸入 7,3,2,3,11 輸出 4,9,9,49,121 1 a.length 10000 10000 a i 10000...