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

news2025/1/11 18:41:26

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

🌈个人主页:主页链接

🌈算法专栏:专栏链接

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

🌈LeetCode专栏:专栏链接 

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

🌈代码仓库:Gitee链接

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

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

目录

题目:

白话讲解:

题解:

解法1:

代码实现:

解法2:

代码实现:

完结撒花:


题目:

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

白话讲解:

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

题解:

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

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

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

第三种:数组中既有正数也有负数,那么在平方后他呈二次函数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;
        
    }
};

 

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

 

完结撒花:

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

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

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

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

🌈诸君,山顶见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/351862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python快速上手系列--日志模块--详解篇

前言本篇主要说说日志模块&#xff0c;在写自动化测试框架的时候我们就需要用到这个模块了&#xff0c;方便我们快速的定位错误&#xff0c;了解软件的运行情况&#xff0c;更加顺畅的调试程序。为什么要用到日志模块&#xff0c;直接print不就好了&#xff01;那得写多少print…

【Linux】进程的概念及操作进程

目录1.什么是进程2.描述进程 - PCB3.进程的具体操作3.1进程的属性与文件属性的关系3.2查看进程准备工作使用指令查找对应进程&#xff1a;在文件中查看进程3.3关闭进程ctrlckill3.4进程的一些特性3.5通过系统调用获取进程标识符3.6通过系统调用创建子进程1.什么是进程 背景&am…

工程师手册:电源设计中的电容选用规则

摘要 电源往往是我们在电路设计过程中最容易忽略的环节。作为一款优秀的设计&#xff0c;电源设计应当是很重要的&#xff0c;它很大程度影响了整个系统的性能和成本。电源设计中的电容使用&#xff0c;往往又是电源设计中最容易被忽略的地方。一、电源设计中电容的工作原理 在…

前段时间公司招人,面了一个要20K的,一问自动化只会点皮毛···

前段时间公司要招2个自动化测试&#xff0c;同事面了几十个候选人&#xff0c;发现了一个很奇怪的现象&#xff0c;面试的时候&#xff0c;如果问的是框架api、脚本编写这些问题&#xff0c;基本上个个都能对答如流&#xff0c;等问到实际项目的时候&#xff0c;类似“怎么从0开…

vue+elementUI 实现设置还款日字母弹窗组件

1、业务背景 还款业务&#xff0c;设置每月还款日&#xff0c;选每月几号扣款&#xff0c;不需要29、30、31&#xff0c;因为不是每个月都有这三天的 2、预期效果图 3、代码实现 3.1 初始化vue项目 地址&#xff1a;https://cn.vuejs.org/guide/introduction.html 3.2 在项…

KMS钥匙管理系统产品分析

背景&#xff1a; 人造成的不可控因素很多 以前拿公司钥匙的时候要先进行纸质登记&#xff0c;还钥匙的的时候也要进行纸质统计&#xff0c; 这个过程中有很多不可控的因素&#xff0c;如果没有登记怎么办&#xff1f;人把钥匙丢了怎么办呢&#xff1f; 产品设计 引入机器&am…

UDP网络编程

UDP和TCP 前几节我们提到了计算机网络编程中的TCP编程&#xff0c;TCP和UDP都是计算机机网络通信的传输层中的传输协议&#xff0c;今天我们来学习计算机网络编程中的基于UDP传输协议的网络编程 首先我们要了解TCP和UDP的区别 它们是同属于计算机网络传输层的传输协议 TCP&…

LeetCode24两两交换链表中的节点 带有输入和输出的完整程序

题目&#xff1a;给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出…

CSAPP学习笔记——虚拟内存(一)

虚拟内存的能力 它将主存看成是一个存储在地址空间的高速缓存&#xff0c;在主存中只保存活动区域&#xff0c;并更具需要在磁盘和主存之间来回传送数据&#xff0c;通过这种方式来高效使用主存&#xff08;DRAM&#xff09;它为每个进程提供了一致的地址空间&#xff0c;从而…

python虚拟环境与环境变量

一、环境变量 1.环境变量 在命令行下&#xff0c;使用可执行文件&#xff0c;需要来到可执行文件的路径下执行 如果在任意路径下执行可执行文件&#xff0c;能够有响应&#xff0c;就需要在环境变量配置 2.设置环境变量 用户变量&#xff1a;当前用户登录到系统&#xff0c;…

【LeetCode】剑指 Offer 07. 重建二叉树 p62 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof/ 1. 题目介绍&#xff08;07. 重建二叉树&#xff09; 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的…

回溯算法问题汇总

文章目录模版一. 组合问题77. 组合216.组合总和III17.电话号码的字母组合39. 组合总和40.组合总和II131.分割回文串93.复原IP地址78.子集90.子集II491.递增子序列46.全排列47.全排列 II332.重新安排行程51. N皇后37. 解数独模版 void backtracking(参数) {if (终止条件) {存放…

Webpack(通俗易懂介绍)

主题&#xff1a;为什么需要webpack&#xff0c;用来干什么&#xff1f; 前言 例如&#xff1a;前端不断的技术更新迭代&#xff0c;为了浏览器更好的兼容到以及项目更好的开发&#xff0c;所有才有需要Webpack来打包代码&#xff0c;本文介绍下&#xff0c;Webpack的定义。 …

无FTTR不千兆,华为星光F30让家中不再有“隐秘的角落”

“恒有二者&#xff0c;余畏敬焉。位我上者&#xff0c;灿烂星空&#xff1b;道德律令&#xff0c;在我心中。”康德《实践理性批判》中&#xff0c;将人对外部世界的探索精神&#xff0c;抽象成了对无尽星空的追逐。以前&#xff0c;光为我们照亮现实世界。现在&#xff0c;人…

vue使用axios发送post请求携带json body参数,后端使用@RequestBody进行接收

前言 最近在做自己项目中&#xff0c;做一个非常简单的新增用户场景&#xff0c;但是使用原生axios发送post请求的时候&#xff0c;还是踩了不少坑的。 唉&#xff0c;说多了都是泪&#xff0c;小小一个新增业务&#xff0c;在自己前后端一起开发的时候&#xff0c;硬是搞了好…

使用QQ聊天机器人上传每日健康日报【Nonebot插件教程】

文章目录前言一、需求分析1.功能需求2.技术需求二、流程分析1.分析请求过程2.分析代码编写过程四、代码编写前言 作为2020级入学的大学生&#xff0c;在疫情的笼罩下步入了大学的校门&#xff0c;到校第一件事就是接到了每日进行健康日报身体情况上报的通知&#xff0c;每日醒…

08 OpenCV腐蚀、膨胀与形态学运算

1 腐蚀 腐蚀操作是一种形态学操作&#xff0c;它用于缩小二值图像中的对象&#xff0c;并去除图像中的噪声和细节。其基本原理是将图像中的每个像素与内核进行比较&#xff0c;如果内核覆盖的区域内所有像素值都为非零值&#xff0c;则该像素保持不变&#xff1b;否则&#xf…

django+vue项目搭建,前后端通信打通,

文章目录django 环境搭建1.创建django骨架项目2.创建应用3.试着启动项目&#xff0c;验证环境OK4.基础配置admin.pysettings.py前端项目搭建1.安装vue-cli2.创建前端项目3.创建时候选什么前端项目结构页面上呈现的内容是怎么来的&#xff1f;这里只说明vue部分曲线救国打通vue和…

Linux软件管理YUM

目录 yum配置文件 创建仓库 yum查询功能 yum安装与升级功能 yum删除功能 yum仓库产生的问题和解决之道 yum与dnf 网络源 YUM就是通过分析RPM的标头数据后&#xff0c;根据各软件的相关性制作出属性依赖时的解决方案&#xff0c;然后可以自动处理软件的依赖属性问题&…

1.1 什么是并发

1.1 什么是并发 并发&#xff1a;指两个或更多独立的活动同时发生。并发在生活中随处可见。我们可以一边走路一边说话&#xff0c;也可以两只手同时做不同的动作。 1.1.1 计算机系统中的并发 当我们提到计算机术语的“并发”&#xff0c;指的是在单个系统里同时执行多个独立…