有序数组的平方

题目

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

思路

1.暴力方法

也就是直接将所有的元素全部先平方,之后利用c++的sort函数将所有的元素全部排序,sort的排序会根据n的大小来选择合适的排序方法。

2.前后元素比较的方法(双指针法)

也就是使用前后两个指针,每次对比两个指针所指的元素平方的大小,哪个元素大的话就先将这个元素存储起来之后变化该指针,持续向后即可

代码

1.暴力方法

#include<iostream>
#include<vector>
#include<math.h>
#include<algorithm>
using namespace std;

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int len = nums.size();
        for(int i = 0;i < len;i++){
            nums[i] = nums[i]*nums[i];
        }
        sort(nums.begin(),nums.end());
        return nums;
    }   
};

int main(int argc, char const *argv[])//测试
{  
    Solution so;
    vector<int>a = {-7,-3,2,3,11};
    so.sortedSquares(a);
    for(int i = 0;i<a.size();i++){
        cout<<a[i]<<endl;
    }
    system("pause");
    
    return 0;
}

2.双指针法

#include<iostream>
#include<vector>
#include<math.h>
#include<algorithm>
using namespace std;

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int>result(nums.size(),0);
        int i = nums.size()-1;
        for(int fast = nums.size()-1,slow = 0;slow<=fast;){
            if((nums[slow]*nums[slow])<(nums[fast]*nums[fast])){
                result[i--]=nums[fast]*nums[fast];
                fast--;
            }else{
                result[i--]=nums[slow]*nums[slow];
                slow++;
            }
        }
        return result;
    }   
};

int main(int argc, char const *argv[])//测试
{  
    Solution so;
    vector<int>a={-4,-1,0,3,10};
    a=so.sortedSquares(a);
    for(int i = 0;i<a.size();i++){
        cout<<a[i]<<endl;
    }
    system("pause");
    return 0;
}

posted @ 2023-03-02 15:04  铜锣湾陈昊男  阅读(4)  评论(0)    收藏  举报