Leetcode 977 有序陣列的平方

2022-10-09 06:12:11 字數 2244 閱讀 4819

題目描述:

給你乙個按非遞減順序排序的整數陣列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...