【双指针问题】977. 有序数组的平方

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

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。


🌈个人主页:主页链接


🌈算法专栏:专栏链接


    我会一直往里填充内容哒!


🌈LeetCode专栏:专栏链接


目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出


🌈代码仓库:Gitee链接


🌈点击关注=收获更多优质内容🌈



记录下今天的Leetcode,虽然是一道简单题,但用了两种解法,都挺快的。


题目:


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


输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]


白话讲解:


就是有一个升序的数组,返回每个元素平方组成的新数组,该数组也满足升序的概念.


题解:


分析题目强调的升序数组,我们可以得出每个元素平方后有三种情况


4654e3ede31d4aa6b527301e5ada63d5.jpg


第一种:数组中全为负数,那么在平方后他呈递减的趋势

第二种:数组中全为正数,那么在平方后他呈递增趋势

第三种:数组中既有正数也有负数,那么在平方后他呈二次函数x^2的形式


解法1:


可以看出,我们需要做的就是找到绝对值最小的元素 然后往两边扩散开(双指针),例如第一种我们找到绝对值最小的元素0,然后往左右两边去扩散开,因为右边没有元素,所以我们将左边元素平方后填入.

再比如第三种:

找到绝对值最小的元素0,之后对两边进行比较

若左边的平方大于右边的平方,则将右边的平方放入答案数组 之后右边的指针向后移动一位.再进行比较,如此循环

当左边到达边界或右边到达边界时退出.再进行一个判断若左边还未到达边界则将左边的元素全部填入答案数组中,反之.(相当于归并排序排序的过程)

代码实现:


class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
       int n=nums.size(),flag=0;
       for(int i=0;i<n;i++)
       {
        if(nums[i]<0)flag=i;
        else break;
       }
       int i=flag,j=i+1;
        vector<int>ans;
        while(i>=0&&j<n)
        {
            if(abs(nums[j])<=abs(nums[i]))ans.push_back(nums[j]*nums[j++]);
            else ans.push_back(nums[i]*nums[i--]);
        }
        while(i>=0){
            ans.push_back(nums[i]*nums[i]);
            i--;
        }
        while(j<n){
            ans.push_back(nums[j]*nums[j]);
            j++;
        }
        return ans;
    }
};

24d08d65e6114762a3f8ee6cf6e4ac29.png


解法2:


这个解法将三种情况用一种模式来搞定,我们可以发现,

若有 两个指针指向这个数组的首位端,那么平方后一定有,大的一定就是填入数组中的那个,所以我们直接将大的那个数填入答案数组中,即可


代码实现:


class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int n=nums.size();
        vector<int>ans(n);
        int i=0,j=n-1,cur=n-1;
        while(i<=j)
        {
            if(nums[i]*nums[i]<=nums[j]*nums[j]){
                ans[cur]=nums[j]*nums[j];
                j--;
            }
            else {
                ans[cur]=nums[i]*nums[i];
                i++;
            }
            cur--;
        }
        return ans;
    }
};


d74cc1cdbc054745bdc716c0c8f42f77.png


完结撒花:


🌈本篇博客的内容【双指针问题 977. 有序数组的平方】已经结束。

       最近在复习要命的线代和计组,只能保证每天一题的频率了(惨兮兮


🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。


🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。


🌈诸君,山顶见!

目录
相关文章
|
9月前
|
人工智能 数据可视化 网络安全
Dify与DeepSeek的深度融合——构建您的专属AI助手
在当今数据驱动、AI为王的时代,Dify与DeepSeek作为领先的AI开发工具和大模型引擎,为企业和个人提供高效智能的解决方案。Dify是面向AI应用开发的低代码平台,集成预训练模型、可视化界面和无缝部署功能;DeepSeek则是高性能、低成本的开源大语言模型,具备多轮推理能力。两者结合并通过私有化部署,确保数据安全与合规,极大提升开发效率和业务生产力。阿里云计算巢提供了两者的私有化部署方案,帮助用户快速搭建专属AI应用。
880 1
|
Web App开发 网络安全 Go
新MacBook到手时,建议你需要做的事情(二)
在Mac上重装系统前,应备份`~/.gitconfig`, `~/.ssh`, `~/.config`等个人配置文件。推荐的软件包括有道云笔记、WPS Office、FastZip、XMind、网络调试助手、Chrome、Clash、iTerm2、oh-my-zsh、Homebrew、Git、wget、tree、telnet、Neovim、tldr、IDEs(如JetBrains产品)、GitHub Desktop、VS Code、
457 0
新MacBook到手时,建议你需要做的事情(二)
|
消息中间件 大数据 Kafka
大厂面试高频:Kafka、RocketMQ、RabbitMQ 的优劣势比较
本文深入探讨了消息队列的核心概念、应用场景及Kafka、RocketMQ、RabbitMQ的优劣势比较,大厂面试高频,必知必会,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:Kafka、RocketMQ、RabbitMQ 的优劣势比较
|
11月前
|
数据可视化 数据挖掘
分享5款无广告,小体积的工具
本文介绍了5款体积小、无广告且实用的软件:格式工厂(文件格式转换)、Starrea(数据可视化)、燃精灵(微信空号检测)、EasyCharts(图表生成)和EagleGet(下载加速)。每款软件都有详细的功能介绍,适合不同需求的用户。观看后可自行搜索下载。
198 0
|
安全 Java 数据库
Springboot 用session监听器统计在线用户数量
Springboot 用session监听器统计在线用户数量
1177 0
Springboot 用session监听器统计在线用户数量
|
安全 前端开发 Java
​springboot代码混淆及反混淆代码工具
​springboot代码混淆及反混淆代码工具
295 0
|
Linux Python Windows
IntelliJ全家桶IDEA/Pycharm2020.1激活方式
IntelliJ全家桶IDEA/Pycharm2020.1激活方式
|
机器学习/深度学习 存储 数据采集
【英文文本分类实战】之二——数据集挑选与划分
【英文文本分类实战】之二——数据集挑选与划分
533 0
【英文文本分类实战】之二——数据集挑选与划分
|
数据采集
重装系统后必装的5大软件,让你大幅度提升工作效率
每次重装系统,都必须安装的软件有哪些?下面就是小编每次重装系统后必须装回来的软件,话不多说,一起来看看吧!
283 1
重装系统后必装的5大软件,让你大幅度提升工作效率
|
Linux Windows
为了做好 Windows「窗口管理」,我改造了一个软件……(二)
这些年来,「大屏就是生产力」的观念深入人心,越来越多的用户开始使用大尺寸屏幕以及多显示器,但有效利用屏幕面积、快捷操作应用窗口还需要软件辅助。
363 0
下一篇
oss云网关配置