【代码随想录-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 <= nums[i] <= 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;//返回新的结果集
    }
   
};
相关推荐
林开落L15 分钟前
前缀和算法习题篇(上)
c++·算法·leetcode
远望清一色16 分钟前
基于MATLAB边缘检测博文
开发语言·算法·matlab
tyler_download17 分钟前
手撸 chatgpt 大模型:简述 LLM 的架构,算法和训练流程
算法·chatgpt
SoraLuna37 分钟前
「Mac玩转仓颉内测版7」入门篇7 - Cangjie控制结构(下)
算法·macos·动态规划·cangjie
我狠狠地刷刷刷刷刷40 分钟前
中文分词模拟器
开发语言·python·算法
鸽鸽程序猿41 分钟前
【算法】【优选算法】前缀和(上)
java·算法·前缀和
九圣残炎1 小时前
【从零开始的LeetCode-算法】2559. 统计范围内的元音字符串数
java·算法·leetcode
YSRM1 小时前
Experimental Analysis of Dedicated GPU in Virtual Framework using vGPU 论文分析
算法·gpu算力·vgpu·pci直通
韭菜盖饭1 小时前
LeetCode每日一题3261---统计满足 K 约束的子字符串数量 II
数据结构·算法·leetcode
xxxmmc2 小时前
Leetcode 75 Sort colors
leetcode·三指针移动问题