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

14天刷爆LeetCode算法学习计划——Day02双指针(1)

Day02——双指针

  • 一、前言
  • 二、知识点
  • 三、LeetCode977. 有序数组的平方
    • 1.题目
    • 2.解题示意图
    • 3.解题思路
    • 4.代码实现
    • 5.验证代码
  • 四、结语

一、前言

盲目刷题只会让自己心态爆炸,所以本期14天算法学习计划,也是LeetCode上的 [算法] 学习计划,在本专栏的每一篇文章都会整理每一天的题目并给出详细题解,以及知识点的整理

二、知识点

双指针其实前面已经在归并排序中有提及,就是两个指针和一个辅助数组(用来存放)排序完的数组,文章链接在下方⬇⬇⬇

算法排序5——归并排序&分治思想

三、LeetCode977. 有序数组的平方

1.题目

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

2.解题示意图

由于将数组以升序排列,所以我们可以有这么个大概思路
两个两个比较,把大的那个就放到新数组里面去,然后比较下一组

这不就是双指针的套路吗!?

确定了是双指针的套路以后,首先我们要先定义两个指针 left 和 right ,分别指向数组的头和尾,再设定一个辅助的数组以存放排序完的数组result[]以及其下标Index,然后比较他们的平方的大小(由题意)哪个更大就把它放到新的数组里面去,这时候这个被比较完的数就被我们“抛弃”了。可以这么理解:它被放到另外的地方去了

如果是末尾的更大的话,那么下一个要比较的就是它前一个数,即指针right的值要减一,再把新的指针right指向的值与幸存的较小的那个再比较,看看哪个大。

如果是首位的更大的话,那么下一个要比较的就是它前=后一个数,即指针left的值要加一,再把新的指针right指向的值与幸存的较小的那个再比较,看看哪个大

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
最后,两个指针都指向同一个数,也就是最小的哪个,所以如果left指针指向的值和right指针指向的值相同的话,可以自行选择是把right指向的值移动还是把left指向的值移动,两种选择都一样
在这里插入图片描述

3.解题思路

  1. 定义一个辅助数组,存放比较完的数
  2. 定义双指针以及辅助数组下标Index
  3. 用两个变量分别接收left和right指针指向的数的平方(使得代码更简洁)
  4. 将平方更大的数放入辅助数组(倒序,因为题目要求从小到大排序)且Index的值-1
  5. 如果更大的是left指向的数,那么left的值+1
  6. 如果更大的是right指向的数,那么right的值-1
  7. 返回值

4.代码实现

class Solution {
    public int[] sortedSquares(int[] nums) {
   		//定义一个辅助数组,存放比较完的数
        int[] result = new int[nums.length];
        //定义双指针
        int left = 0;
        int right = nums.length - 1;
        //定义辅助数组下标
        int Index = nums.length - 1;
        while(left <= right){
       		//用变量接收平方值
            int num1 = nums[left] * nums[left];
            int num2 = nums[right] * nums[right];
            
            //判断左右指针谁指向的数的平方更大
            //左指针更大
            if(num1 >= num2){
                result[Index] = num1;
                left ++;
                Index--;
            }
            
            //右指针更大
            else{
                result[Index] = num2;
                right--;
                Index--;
            }
        }
        //返回值
        return result;
    }
}

5.验证代码

在这里插入图片描述

四、结语

本题还有暴力解法,代码也很简单,但是复杂度要更高,所以在这里没有贴出代码。下一篇文章将分析一道有关双指针的中等题,如果有其它思路欢迎评论留言

相关文章:

  • 存储过程浅入深出
  • 一零二四、pyspark在jupyter中的完美运行
  • Nginx监控模块
  • mybatis的test坑(不等于‘‘ 且 不等于0)
  • 使用IDEA快速部署到Docker云端
  • 全志T507 UART复用方法-飞凌嵌入式知识库
  • 【机器学习】过拟合和欠拟合怎么判断,如何解决?(面试回答)
  • 2022年数模国赛冲刺之模型复习2
  • 程序包lombok不存在,纠正网上错误答案
  • css知识点总结
  • 【Rust日报】2022-08-29 RLS 谢幕
  • 【Python黑科技】图片太大不能上传?三种压缩图片大小的方法(代码注释详细)
  • hadoop生态圈面试精华之Yarn
  • 阿里云:加大NoSQL数据库软硬件一体化技术自研
  • 机构用户注册/登录的设计
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • [译] React v16.8: 含有Hooks的版本
  • javascript从右向左截取指定位数字符的3种方法
  • PV统计优化设计
  • 从重复到重用
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 一个完整Java Web项目背后的密码
  • - 转 Ext2.0 form使用实例
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​2021半年盘点,不想你错过的重磅新书
  • ​520就是要宠粉,你的心头书我买单
  • ​虚拟化系列介绍(十)
  • # centos7下FFmpeg环境部署记录
  • #define用法
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (windows2012共享文件夹和防火墙设置
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (八)c52学习之旅-中断实验
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)大型网站架构演变和知识体系
  • (转)甲方乙方——赵民谈找工作
  • .Net各种迷惑命名解释
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET文档生成工具ADB使用图文教程
  • .NET中使用Redis (二)
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [.net]官方水晶报表的使用以演示下载