算法入门--有序数组的平方
给你一个按 非递减顺序 排序的整数数组 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 <= 104 -104 <= nums[i] <= 104 nums 已按 非递减顺序 排序 进阶: 请你设计时间复杂度为 O(n) 的算法解决本问题 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/squares-of-a-sorted-array 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的代码:
1 class Solution { 2 public: 3 vector<int> sortedSquares(vector<int>& nums) { 4 for(vector<int>::iterator it=nums.begin();it!=nums.end();it++) 5 { 6 *it=(*it)*(*it); 7 } 8 sort(nums.begin(),nums.end()); 9 return nums; 10 } 11 };
但是官方写了三种
方法一:直接排序
思路与算法
最简单的方法就是将数组 numsnums 中的数平方后直接排序。
1 class Solution { 2 public: 3 vector<int> sortedSquares(vector<int>& nums) { 4 vector<int> ans; 5 for (int num: nums) { 6 ans.push_back(num * num); 7 } 8 sort(ans.begin(), ans.end()); 9 return ans; 10 } 11 }; 12 13 作者:LeetCode-Solution 14 链接:https://leetcode.cn/problems/squares-of-a-sorted-array/solution/you-xu-shu-zu-de-ping-fang-by-leetcode-solution/ 15 来源:力扣(LeetCode) 16 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法二:
1 class Solution { 2 public: 3 vector<int> sortedSquares(vector<int>& nums) { 4 int n = nums.size(); 5 int negative = -1; 6 for (int i = 0; i < n; ++i) { 7 if (nums[i] < 0) { 8 negative = i; 9 } else { 10 break; 11 } 12 } 13 14 vector<int> ans; 15 int i = negative, j = negative + 1; 16 while (i >= 0 || j < n) { 17 if (i < 0) { 18 ans.push_back(nums[j] * nums[j]); 19 ++j; 20 } 21 else if (j == n) { 22 ans.push_back(nums[i] * nums[i]); 23 --i; 24 } 25 else if (nums[i] * nums[i] < nums[j] * nums[j]) { 26 ans.push_back(nums[i] * nums[i]); 27 --i; 28 } 29 else { 30 ans.push_back(nums[j] * nums[j]); 31 ++j; 32 } 33 } 34 35 return ans; 36 } 37 };
方法三:
1 class Solution { 2 public: 3 vector<int> sortedSquares(vector<int>& nums) { 4 int n = nums.size(); 5 vector<int> ans(n); 6 for (int i = 0, j = n - 1, pos = n - 1; i <= j;) { 7 if (nums[i] * nums[i] > nums[j] * nums[j]) { 8 ans[pos] = nums[i] * nums[i]; 9 ++i; 10 } 11 else { 12 ans[pos] = nums[j] * nums[j]; 13 --j; 14 } 15 --pos; 16 } 17 return ans; 18 } 19 };