当前位置: 首页 > article >正文

[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]

    二.题解 

    解法一:傻瓜式直接排序

    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

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

    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  从数组的两端向内延伸,数的绝对值逐渐减小 所以两端的数据绝对值是最大的。用两个指针从数组的一头一尾向中间进行遍历,每次去比较两端数据谁的平方更大,将更大的逆序放入结果数组中

    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;
        }
    };
    

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


    http://www.kler.cn/a/526335.html

    相关文章:

  • python | OpenCV小记(一):cv2.imread(f) 读取图像操作(待更新)
  • java+vue项目部署记录
  • OSCP:发送钓鱼电子邮件执行客户端攻击
  • 零基础Vue入门4——Vue3基础核心
  • C28.【C++ Cont】顺序表的实现
  • SpringBoot源码解析(八):Bean工厂接口体系
  • 【Python】深入理解Python中的装饰器链:创建组合装饰器的技巧与实践
  • 【Block总结】动态蛇形卷积,专注于细长和弯曲的局部结构|即插即用
  • STM32 PWMI模式测频率占空比
  • (持续更新中~~)3、原来可以这样理解C语言_分⽀和循环上(3)条件操作符
  • 使用Python进行大模型的测试与部署
  • 8642 快速排序
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.18 逻辑运算引擎:数组条件判断的智能法则
  • Java中的注解与反射:深入理解getAnnotation(Class<T> annotationClass)方法
  • 在 Linux 上安装 Microsoft TrueType 字体:ttf-mscorefonts-installer 指南
  • 数据结构:线性表查找的三种方式
  • 向下调整算法(详解)c++
  • 指针空值——nullptr(C++11)——提升指针安全性的利器
  • Hive:静态分区(分区语法,多级分区,分区的查看修改增加删除)
  • 无公网IP 外网访问 本地部署夫人 hello-algo
  • 【赵渝强老师】K8s中Pod探针的TCPSocketAction
  • 新年手搓--本地化部署DeepSeek-R1,全程实测
  • Pandas进行MongoDB数据库CRUD
  • 题海拾贝:二叉树遍历
  • 【愚公系列】《循序渐进Vue.js 3.x前端开发实践》028-组件Props属性的高级用法
  • 文件上传2