[LeetCode]day4 977.有序数组的平方

977. 有序数组的平方 - 力扣(LeetCode)

一.题目

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

二.题解

解法一:傻瓜式直接排序

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

思路非常简单 就是把数组内每个元素平方之后 调用库函数直接进行排序

时间复杂度比较高,为nlogn

解法二:双指针更复杂解法

cpp 复制代码
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> ans;
        int q = -1;  // 初始q指向ans数组的"尾"
        
        for (int i = 0; i < nums.size(); i++) {
            ans.push_back(nums[i] * nums[i]);  // 将平方值加入ans
            q++;  // 增加"尾指针"

            // 如果新添加的元素小于之前的元素,说明需要重新插入排序
            int temp = ans[q];  // 保存当前插入的平方值
            int p = q - 1;  // 用p寻找插入位置

            // 向前遍历查找插入位置
            while (p >= 0 && ans[p] > temp) {
                ans[p + 1] = ans[p];  // 右移元素
                p--;
            }

            // 插入当前的平方值
            ans[p + 1] = temp;
        }
        return ans;
    }
};

时间复杂度为O(N^2)

这个的思路是将数组从头到尾遍历一遍 每遍历一个元素就加入结果数组中去,将新加入的元素与原来元素的最后一个元素进行对比,如果比它小,则需要重新排序;

解法三:双指针两面夹击法

我们注意观察数组的特征,会存在负数! 类似-5,-3,1,2,3 从数组的两端向内延伸,数的绝对值逐渐减小 所以两端的数据绝对值是最大的。用两个指针从数组的一头一尾向中间进行遍历,每次去比较两端数据谁的平方更大,将更大的逆序放入结果数组中

cpp 复制代码
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int>ans(nums.size()); //注意给数组预留空间
        int k= nums.size()-1; 
        for(int i=0,j=nums.size()-1;i<=j;){
            if(nums[i]*nums[i]>nums[j]*nums[j]){
                ans[k--]=nums[i]*nums[i];
                i++;
            }else{
                ans[k--]=nums[j]*nums[j];
                j--;
            }
        }
        return ans;
    }
};

易错点在于需要逆序将数据存放进目标数组中!

相关推荐
晨曦夜月16 分钟前
map与unordered_map区别
算法·哈希算法
qeen8730 分钟前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码41 分钟前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler011 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
minglie11 小时前
实数列的常用递推模式
算法
我星期八休息1 小时前
IT疑难杂症诊疗室:AI时代工程师Superpowers进化论
linux·开发语言·数据结构·人工智能·python·散列表
代码小书生1 小时前
math,一个基础的 Python 库!
人工智能·python·算法
AI科技星1 小时前
全域数学·数术本源·高维代数卷(72分册)【乖乖数学】
人工智能·算法·数学建模·数据挖掘·量子计算
生成论实验室1 小时前
《事件关系阴阳博弈动力学:识势应势之道》第一篇:生成正在发生——从《即事经》到事件-关系网络
人工智能·科技·算法·架构·创业创新
漂流瓶jz1 小时前
UVA-1152 和为0的4个值 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·二分查找·题解·aoapc·算法竞赛入门经典·uva