【刷题】双指针入门

news2024/11/25 20:31:28

在这里插入图片描述

双指针入门

  • 双指针
  • 283.移动零
  • 1089. 复写零
  • 202. 快乐数
  • 11. 盛最多水的容器
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

双指针

双指针是非常经典的算法,包括但不限于前后双指针,快慢双指针,特殊双指针
尤其需要注意的是双指针并不能只局限于指针,数组下标,过程数据都可以成为“指针”。重要的是能够灵活使用双指针的思想,把解题思路捋顺
下面,我们来会会几道双指针的题目:

283.移动零

家人们 !!! 上连接:283.移动零

在这里插入图片描述
通过题目,发现这并不是一到很复杂的题。主要难点在于不改变数组的相对顺序。
这里我们使用前后双指针,逐渐遍历完成操作:

  1. 首先定义两个数组下标 i j
  2. 我们赋予他们不同含义:
    [ 0 ,i)是已经处理过,已经没有零的部分 并按相对顺序排好
    [i , j] 是零的部分
    (j , n) 待处理的部分
  3. 我们控制 j 来进行整个数组的遍历,0 到 i是非零数据。
  4. 遇到 0 ,i j 位置互换即可
    在这里插入图片描述
    来看代码:(类似冒泡排序的过程,把零向后挪动)
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        for(int i = 0,j = 0;j<nums.size();j++)
            if(nums[j] != 0) swap(nums[j],nums[i++]);
    }
};

非常简洁的代码。就可以完成我们的操作。来看效果:
在这里插入图片描述
很好!过啦!!!!

1089. 复写零

家人们!!!跟上节奏:1089. 复写零
在这里插入图片描述
这道题与前面的移动零很像,但使用的算法细节不同。
这里需要的也是双指针 i j:

  1. 首先定义两个数组下标 i j
  2. 赋予他们不同含义:
    0 到 i 是处理完的部分
    i 到 j 是 未处理部分
  3. 首先使用 i 遍历整个数组,j 负责调换未处理的数据(将数据后移,空出新的零的位置)
    在这里插入图片描述
    来看代码:
class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        for(int i = 0;i<arr.size();i++){
            if(arr[i] == 0){
                for(int j = arr.size() - 1 ; j > i ; j--){
                    arr[j] = arr[j - 1];
                }
                ++i;
            }
        }

    }
};

运行效果:
在这里插入图片描述

202. 快乐数

家人们!!! 继续干:202. 快乐数

在这里插入图片描述
这道题是比较特殊的一道题,我们来看奥:
首先看测试用例的 1 9 和 2 ;
在这里插入图片描述
可以发现最后都会处于循环:这里可以证明一下为什么都会处于循环:
假设我们最大数为 99999 99999 那对应的数为 810 ,相当于 0 到 9999999999 只有 810 个数与之对应,所以必然会出现循环。
到这里,大家应该也看出这和判断链表是否有环很像,使用快慢指针,慢指针依次进行一步操作,快指针一次两步操作。这里“指针”代指数字。


class Solution {
public:
	//操作函数
    int getsum(int n ){
        int sum = 0;
        while(n){
            int i = n % 10;
            sum += i*i;
            n /= 10;
        }
         return sum;
        }

    bool isHappy(int n) {
		//初始化
        int slow = n;
        int fast = getsum(n);
		//进行循环 直到相遇
        while(slow != fast){
            slow = getsum(slow);
            fast = getsum(getsum(fast));
           
        }
        //判断一下即可
        if(slow == 1) return true;
        return false;

    }
};

来看效果:
在这里插入图片描述
很好! 过啦!!!!

11. 盛最多水的容器

家人们,终于到了最后一题: 11. 盛最多水的容器
这道题可谓十分抽象:
在这里插入图片描述
这里使用前后双指针,代我细细到来为什么:
首先我们选取前后这一片段,然后得到一个体积值。
这时我们可以进行一下分析:

  1. 如果移动较大这边的指针,那长必然减小 , 高一定不会增加所以不需移动较高这边
  2. 再来看较小这边,移动后不能确定到底是增加还是减少,所以需要移动进行遍历

根据这两条规矩我们就可以完成操作:来看图解(来自 力扣官方题解)
在这里插入图片描述
这样必然可以得到答案。

class Solution {
public:

    int maxArea(vector<int>& height) {
        int i = 0;
        int j = height.size() - 1;
		// 记录答案值
        int ans = 0;
        while(i != j){
        	//求得新的体积
            int v = min(height[i],height[j]) * (j - i);
            //取最大值
            ans = max(ans,v);
            // 移动较小的指针
            if(height[i] < height[j])
                i++;
            else
                j--;

        }
        return ans;
    }
};

来看效果:
在这里插入图片描述
过啦!!!(还存在改进空间)

经过这四道题目的洗礼,我大概对双指针有了初步印象,接下来我会继续努力!!!

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

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

相关文章

6. Gin集成redis

文章目录 一&#xff1a;连接Redis二&#xff1a;基本使用三&#xff1a;字符串四&#xff1a;列表五&#xff1a;哈希六&#xff1a;Set七&#xff1a;管道八、事务九&#xff1a;示例 代码地址&#xff1a;https://gitee.com/lymgoforIT/golang-trick/tree/master/14-go-redi…

Cookie 探秘:了解 Web 浏览器中的小甜饼

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

java开发工程师面试题,996页阿里Java面试真题解析火爆全网

开头 消息队列 RocketMQ 是阿里巴巴集团基于高可用分布式集群技术&#xff0c;自主研发的云正式商用的专业消息中间件&#xff0c;既可为分布式应用系统提供异步解耦和削峰填谷的能力&#xff0c;同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性&#xff0c;…

b站小土堆pytorch学习记录—— P18-P22 神经网络+小实战

文章目录 一、卷积层 P181.卷积操作2.代码 二、池化层 P191.池化层简单介绍2.代码&#xff08;1&#xff09;池化操作中数字的变化&#xff08;2&#xff09;池化操作对图片的影响 三、非线性激活 P201.简要介绍2.代码 四、线性层及其他层介绍 P211.线性层2.代码 五、搭建小实战…

C++初阶:初识C++

目录 1. 前言&#xff1a;C 与 C语言2. C对于C语言语法的完善与补充2.1 命名冲突与命名空间2.1.1 命名空间的定义2.1.2 调用方式 2.3 补充&#xff1a;流的概念2.4 缺省参数2.4.1 缺省参数的使用 2.5 函数重载2.5.1 什么是函数重载2.5.2 函数重载的使用2.5.3 特殊情况&#xff…

七、链表问题(上)

160、相交链表&#xff08;简单&#xff09; 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个…

如何采集京东搜索页面商品的销量、价格数据?

这段Python代码旨在从京东网站上获取商品信息&#xff0c;包括评论数量和评论的关键词&#xff0c;以便进行进一步的分析。该程序分析并模拟了京东的JavaScript请求&#xff0c;以获取动态加载的评论数据。 代码都测试验证过都能正常跑通&#xff0c;实现效果&#xff0c;由于…

图像处理与视觉感知---期末复习重点(1)

文章目录 一、概述二、图像处理基础2.1 视觉感知要素2.2 像素间的一些基本关系2.2.1 相邻像素2.2.2 连通性2.2.3 距离度量 2.3 基本坐标变换2.4 空间变换与灰度值 一、概述 1. 图像的概念及分类。  图像是用各种观测系统以不同形式和手段观测客观世界而获得的、可以直接或间接…

C++——string类

前言&#xff1a;哈喽小伙伴们&#xff0c;从这篇文章开始我们将进行若干个C中的重要的类容器的学习。本篇文章将讲解第一个类容器——string。 目录 一.什么是string类 二.string类常见接口 1.string类对象的常见构造 2.string类对象的容量操作 3. string类对象的访问及遍…

【DevSecOps】2024 年需要警惕的 10 大 Web 应用程序安全威胁

【DevSecOps】2024 年需要警惕的 10 大 Web 应用程序安全威胁 由于 2023 年出现了许多创新,我们之前所了解的许多内容都发生了巨大变化;随着其中一些重大变化,威胁格局也发生了转变,一些旧威胁减少了,一些新威胁增加了。 技术每天都在不断变化,当我们谈论技术和相关威胁…

MetaQTL:元分析基础教程

MetaQTL 基础知识 在遥远的海洋中&#xff0c;每个岛屿都藏着无尽的宝藏&#xff0c;而探险家们争相寻找地图&#xff0c;以期揭开宝藏的秘密。 现实世界中&#xff0c;我们的基因组就像那片广阔的海洋&#xff0c;而隐藏在其中的宝藏就是控制我们身高、健康、甚至是我们性格的…

Netty之WebSocket协议开发

一、WebSocket产生背景 在传统的Web通信中&#xff0c;浏览器是基于请求--响应模式。这种方式的缺点是&#xff0c;浏览器必须始终主动发起请求才能获取更新的数据&#xff0c;而且每次请求都需要经过HTTP的握手和头部信息的传输&#xff0c;造成了较大的网络开销。如果客户端…

git 命令怎么回退到某个特定的 commit 并将其推送到远程仓库?

问题 不小心把提交的名称写错提交上远程仓库了&#xff0c;这里应该是 【029】的&#xff0c;这个时候我们想回到【028】这一个提交记录&#xff0c;然后再重新提交【029】到远程仓库&#xff0c;该怎么处理。 解决 1、首先我们找到【028】这条记录的提交 hash&#xff0c;右…

微信小程序开发系列(八)·微信小程序页面的划分以及轮播图区域的绘制和图片的添加

目录 1. 划分页面结构 2. 轮播图区域绘制 3. 轮播图图片添加 1. 划分页面结构 最终我们想达到如下效果&#xff1a; 其页面分为四层结构&#xff0c;因此我们需要配置四块view&#xff0c;代码如下&#xff1a; <!-- view 小程序提供的容器组件&#xff0c;可以当成…

《ChatGPT原理与架构:大模型的预训练、迁移和中间件编程 》

OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景&#xff0c;在多项专业和学术基准测试中表现出的智力水平&#xff0c;不仅接近甚至有时超越了人类的平均水平。这使得 ChatGPT 在推出之初就受到广大用户的欢迎&#xff0c;被科技界誉为人工智能…

zabbix监控中间件服务

zabbix监控Nginx 自定义nginx访问量的监控项&#xff0c;首先要通过脚本将各种状态的值取出来&#xff0c;然后通过zabbix监控。找到自定义脚本上传到指定目录/etc/zabbix/script/ 在zbx-client客户端主机操作 #创建目录&#xff0c;然后将脚本上传到该目录mkdir /etc/zabbix/…

7,图像镜像变换

水平镜像就是x图像宽度-原来的x&#xff0c; 垂直镜像就是y图像高度-原来的y void CDib::Mirror_Horizontal() { //指向原图像指针 LPBYTE lpSrc; LPBYTE p_data GetData(); //指向复制区域的指针 LPBYTE lpDst; //图像的宽和高 LONG width GetWidth(); LONG height GetHei…

备战蓝桥杯————二分查找(二)

引言 在上一篇博客中&#xff0c;我们深入探讨了二分搜索算法及其在寻找数组左侧边界的应用。二分搜索作为一种高效的查找方法&#xff0c;其核心思想在于通过不断缩小搜索范围来定位目标值。在本文中&#xff0c;我们将继续这一主题&#xff0c;不仅会回顾二分搜索的基本原理&…

【C++专栏】C++入门 | 命名空间、输入输出、缺省参数

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;C专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家 点赞&#x1f44d;收藏⭐评论✍ C入门 | 命名空间、输入输出、缺省参数 文章编号&#xff1a;C入门 / 0…

Java agent技术的注入利用与避坑点

什么是Java agent技术&#xff1f; Java代理&#xff08;Java agent&#xff09;是一种Java技术&#xff0c;它允许开发人员在运行时以某种方式修改或增强Java应用程序的行为。Java代理通过在Java虚拟机&#xff08;JVM&#xff09;启动时以"代理"&#xff08;agent…