LeetCode简单题之有序数组的平方
題目
給你一個按 非遞減順序 排序的整數數組 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 <= nums.length <= 10^4
-10^4 <= nums[i] <= 10 ^4
nums 已按 非遞減順序 排序
進階:
請你設計時間復雜度為 O(n) 的算法解決本問題
來源:力扣(LeetCode)
解題思路
??題目十分的簡單,遍歷求平方然后排序即可。
class Solution:def sortedSquares(self, nums: List[int]) -> List[int]:return sorted([i**2 for i in nums])
??這樣做的話是有一個條件沒有用上,那就是數組是非遞減的。進一步的優化可以在排序算法上,比如當前數組已經基本有序,那么利用插入排序就會有不錯的提升,但是這樣仍然達不到進階的意見。考慮插入排序,有效的操作也只是將負數的平方一個個插入有序的正數序列中,但其實負數序列也是非遞減的,所以負數序列和正數序列是兩個有序的序列,這樣的話就會是兩個有序的歸并段,兩個歸并段的排序時間復雜度便會降到O(n)。
class Solution:def sortedSquares(self, nums: List[int]) -> List[int]:if nums[0]>=0:return [i**2 for i in nums]for i in range(len(nums)):if nums[i]>=0:breakx=0y=0temp=[]while x<i and y<len(nums)-i:a=nums[0:i][::-1][x]**2b=nums[i:][y]**2if a>b:temp.append(b)y+=1else:temp.append(a)x+=1if x<i:return temp+[j**2 for j in nums[0:i][::-1][x:]]else:return temp+[j**2 for j in nums[i:][y:]]
??理論上時間復雜度低的話用時應該更短,出現這種情況應該是代碼出了一些問題,可能還得進行代碼上的優化。
總結
以上是生活随笔為你收集整理的LeetCode简单题之有序数组的平方的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode简单题之二叉搜索树的范围
- 下一篇: LeetCode简单题之最长的美好子字符