【代码随想录-Leetcode第三题:977. 有序数组的平方】

题目

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

cpp 复制代码
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:

cpp 复制代码
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

提示:

  • 1 <= nums.length <= 104
  • 104 <= numsi <= 104
  • nums 已按 非递减顺序 排序

思路

方法一: 先求解,再排序。

cpp 复制代码
class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        for (int i = 0; i < A.size(); i++) {
            A[i] *= A[i];
        }
        sort(A.begin(), A.end()); // 快速排序
        return A;
    }
}

方法2 :牺牲空间来换取时间复杂度:
思路:既然起始时顺序是排好的,只不过第一个位置的负的元素可能平方后可能是最大的,也有可能是最后一个元素的平方后是最大的,要排在最后。既然这样,最大的数排在最后或者开头(负数),因此不会在中间。

1、定义一个新的数组result用来结果,定义一个变量k指向result最后一个位置,当有最大的数据筛选出来时,每次把它移入到新数组组中。

2、定义两个"指针"i,j分别指向原数组nums的数组的起始位置和末尾位置。

3、如果num[i]*nums[i]>nums[j]*nums[j]时,说明起始位置的元素比较大。将其移入到新元素的末位置中,同时使得k--,i++。

4、如果num[i]*nums[i]<=nums[j]*nums[j]时,说明起始位置的元素比较小,末尾元素比较大。将其移入到新元素的末位置中,同时使得k--,j--;

5、最后返回result数组即可。

代码实现:

cpp 复制代码
//方法2 @i want to 武动乾坤 2023/08/08
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int k=nums.size()-1;//使得k指向result数组最后一个位置
        vector<int> result(nums.size(),0);//定义result容器
        for(int i=0,j=nums.size()-1;i<=j;){//i<=j保证最后两个数据也能被比较加入新数组
        if(nums[i]*nums[i]>nums[j]*nums[j]){//起始位置大
        result[k--]=nums[i]*nums[i];//注意k--是先赋值再--
        //等同于result[k]=nums[i];  k--;
        i++;//指针向后移动
        }else{
           
        result[k--]=nums[j]*nums[j];//注意k--是先赋值再--
        //等同于result[k]=nums[i]*nums[i];  k--;
        j--;//指针向前移动

             }

        }
        return result;//返回新的结果集
    }
   
};
相关推荐
csdn_aspnet8 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
赤生云电竞8 小时前
GPU算力共享平台架构实践:任务分发与资源隔离的关键配置
算法·架构·gpu算力
青少儿编程课堂10 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
wo_jack11 小时前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
Oneshot12 小时前
DLX(Dancing Links)算法详解:求解数独最快的算法
算法
文丑颜不良啊12 小时前
LeetCode2541~2560题目解析
java·leetcode
青少儿编程课堂12 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
kongdong13 小时前
Hikyuu | RSI均值回归交易策略实现
算法·均值算法·回归·量化交易·交易策略·hikyuu
小王C语言13 小时前
优选算法:分治-归并排序
算法
zaizai100714 小时前
算法(左程云)1
数据结构