算法入门--有序数组的平方

给你一个按 非递减顺序 排序的整数数组 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 };

 

posted @ 2023-01-28 10:43  阿飞藏泪  阅读(18)  评论(0编辑  收藏  举报
1 2 3
4