【LeetCode-陣列】有序陣列的平方
阿新 • • 發佈:2020-08-17
題目描述
給定一個按非遞減順序排序的整數陣列 A,返回每個數字的平方組成的新陣列,要求也按非遞減順序排序。
示例:
輸入:[-4,-1,0,3,10]
輸出:[0,1,9,16,100]
輸入:[-7,-3,2,3,11]
輸出:[4,9,9,49,121]
說明:
- 1 <= A.length <= 10000
- -10000 <= A[i] <= 10000
- A 已按非遞減順序排序。
題目連結: https://leetcode-cn.com/problems/squares-of-a-sorted-array/
思路1
將陣列平方後排序。
class Solution { public: vector<int> sortedSquares(vector<int>& A) { if(A.empty()) return {}; vector<int> ans; for(int i=0; i<A.size(); i++){ ans.push_back(A[i]*A[i]); } sort(ans.begin(), ans.end()); return ans; } };
- 時間複雜度:O(nlogn)
- 空間複雜度:O(n)
思路2
因為陣列是有序的,所以可以用雙指標來做。left 指向陣列頭,right 指向陣列尾:
- 如果 left<=right,迴圈:
- 如果 nums[left]+nums[right]<0,說明 nums[left] 為負數且 nums[left]^2>nums[right]^2,此時將 nums[left] 的平方放入答案中,left++;
- 否則,說明 nums[left]^2<=nums[right]^2,將 nums[right]^2 放入答案中,right--;
程式碼如下:
class Solution { public: vector<int> sortedSquares(vector<int>& A) { if(A.empty()) return {}; vector<int> ans(A.size(), 0); int left = 0; int right = A.size()-1; int k = right; while(left<=right){ if(A[left]+A[right]<0){ ans[k--] = A[left]*A[left]; left++; }else{ ans[k--] = A[right]*A[right]; right--; } } return ans; } };
- 時間複雜度:O(n)
- 空間複雜度:O(n)