算法:双指针系列(一)

news2024/10/9 22:11:22

在这里插入图片描述

双指针系列

  • 一、移动零
  • (一)题目分析
  • (二)代码展示
  • 二、复写零
  • (一)题目分析
  • (二)代码展示
  • 三、快乐数
  • (一)题目分析
  • (二)代码展示
  • (四)总结

一、移动零

点击跳往题目
在这里插入图片描述

(一)题目分析

将数组分为三个区域(已遍历非零区, 已遍历零区,未遍历区),用两个指针来维护这三个区域。
在这里插入图片描述

(二)代码展示

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int des = -1, cur = 0;
        while(cur < nums.size()){
            if(nums[cur] != 0) {
                des += 1;
                swap(nums[cur], nums[des]);
            }
            cur += 1;
        }
        //nums.resize(des + 1);
    }
};

二、复写零

在这里插入图片描述

(一)题目分析

这道题目中,也是采取双指针进行复写。我们可以开辟一段新空间复写比较简单,题目要求在原生空间复写。如果此时直接使用双指针会导致数组空间覆盖,可以先用双指针遍历找到复写的最后一个元素,反向复写,这样就不会出现问题。

(二)代码展示

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int cur = -1, dest = -1;
        while (dest < ((int)arr.size() - 1)) {
            if (!arr[++cur]) dest++;
            dest++;
        }
        if (dest == arr.size()) {
            arr[--dest] = 0;
            dest--;
            cur--;
        }
        while (cur >= 0) {
            if (arr[cur] == 0) arr[dest--] = 0;
            arr[dest--] = arr[cur--];
        }
    }
};

三、快乐数

(一)题目分析

我们将这道题可以与链表的判环问题结合起来,要么存在循环,要么这个数就是快乐数。
只需要创建一个getNext 函数即可。

(二)代码展示

在这里插入图片描述

class Solution {
public:
    int getNext(int val) {
        int ret = 0;
        while (val > 0) {
            int temp = val % 10;
            ret = temp * temp + ret;
            val /= 10;
        }
        return ret;
    }

    bool isHappy(int n) {
        int fast = getNext(n), slow = n;
        while (fast != 1 && fast != slow) {
            fast = getNext(getNext(fast));
            slow = getNext(slow);
        }
        return fast == 1;
    }
};

(四)总结

涉及到元素的移动,数组的分区,亦或是判断是否有环(追击问题),双指针是不错的选择。

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

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

相关文章

OceanBase 4.x 部署实践:如何从单机扩展至分布式部署

OceanBase 4.x 版本支持2种部署模式&#xff1a;单机部署与分布式部署&#xff0c;同时支持从单机平滑扩展至分布式架构。这样&#xff0c;可以有效解决小型业务向大型业务转型时面临的扩展难题&#xff0c;降低了机器资源的成本。 以下将详述如何通过命令行&#xff0c;实现集…

Matlab数据预处理——最小二乘法消除多项式趋势项

关注公众号“电击小子程高兴的MATLAB小屋”获取专属优惠 概要&#xff1a; 最小二乘法是一种常用的统计方法&#xff0c;用于通过拟合数据来消除多项式趋势项。以下是关于如何使用最小二乘法消除多项式趋势项的步骤和概念&#xff1a; 概念&#xff1a; 多项式趋势项&#…

动态规划一>解码方法

1.题目&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 2.解析&#xff1a; 版本一&#xff1a;图解&#xff1a; 注意&#xff1a; 前导0不能解码&#xff1a;06, 或者两个数字字符&#xff1a;其中一个解码失败&#xff0c;整个也解码失败 /**1.创建dp表2.初始化3.填…

GIS小技巧——一文教会你安装BlenderGIS插件

Blender是一款不错的三维渲染软件&#xff0c;用它来做三维地形图&#xff0c;能够更好地把地形纹理显现出来。不过&#xff0c;原始的Blender是没有地图底图的&#xff0c;要结合三维影像制作三维地形图&#xff0c;需要结合其他的软件&#xff0c;比如ArcGIS Pro&#xff0c;…

基于RSSI原理的蓝牙定位程序(matlab代码,3维空间、基站数量>3即可,可自适应)

目录 商品描述 商品描述 这款基于接收信号强度指示&#xff08;RSSI&#xff09;原理的蓝牙定位程序&#xff0c;专为需要高效、可靠定位解决方案的开发者和研究人员设计。无论是在室内环境还是复杂的三维空间&#xff0c;该程序都能通过N个蓝牙锚点&#xff0c;实现对未知点的…

重学SpringBoot3-集成Redis(十)之实时统计和分析

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;十&#xff09;之实时统计和分析 1. 实时统计和分析的常见场景2. 使用 Redis 数据结构进行实时统计3. 使用Redis String实现计数器…

linux线程 | 一篇文章带你理解线程的概念

前言:本篇讲述linux里面线程的相关概念。 线程在我们的教材中的定义通常是这样的——线程是进程的一个执行分支。 线程的执行粒度&#xff0c; 要比进程要细。 我们在读完这句话后其实并不能很好的理解什么是线程。 所以&#xff0c; 本节内容博主将会带友友们理解什么是线程&a…

vscode软件中可以安装的一些其他插件

一. 简介 前面了解了 在 做 C开发时 vscode软件需要安装的一些常用插件。文章如下&#xff1a; vscode软件在 C发中常用插件-CSDN博客 本文继续了解一些其他好用的插件。 二. vscode软件中可以安装的一些其他插件 1. 字体插件 FIRA CODE FIRA CODE 致力于提升代码的连贯…

Chromium 中chrome.history扩展接口c++实现

一、前端 chrome.history定义 使用 chrome.history API 与浏览器的已访问网页的记录进行交互。您可以在浏览器的历史记录中添加、移除和查询网址。如需使用您自己的版本替换历史记录页面&#xff0c;请参阅覆盖网页。 更多参考&#xff1a;chrome.history | API | Chrome…

LSTM 长短期记忆网络:解锁时间序列数据的深层秘密

在这个数据驱动的时代&#xff0c;理解和预测时间序列数据成为了许多领域的关键。从股票价格预测到天气模式分析&#xff0c;从自然语言处理到健康监测&#xff0c;时间序列数据无处不在&#xff0c;并且蕴含着丰富的信息。然而&#xff0c;传统的神经网络在处理这类数据时往往…

Openstack 安装教程

1.首先更新系统 sudo apt update sudo apt upgrade -y2.安装必要软件包 sudo apt install -y software-properties-common3.添加openstack官方仓库 sudo add-apt-repository cloud-archive:train sudo apt update4.安装openstack核心组件 sudo apt install -y python3-opens…

技术分享 —— JMeter接口与性能测试实战!

前言 在软件开发和运维过程中&#xff0c;接口性能测试是一项至关重要的工作。JMeter作为一款开源的Java应用&#xff0c;被广泛用于进行各种性能测试&#xff0c;包括接口性能测试。本文将详细介绍如何使用JMeter进行接口性能测试的过程和步骤。 JMeter是Apache组织开发的基…

Redis-02 持久化

redis持久化即将数据从内存写入磁盘&#xff0c;Redis提供了两种持久化的方式&#xff1a;RDB和AOF。 1.RDB RDB持久化&#xff1a;Redis可以将内存中的数据定期快照保存到磁盘上的一个二进制文件中。RDB持久化是一种比较紧凑的文件格式&#xff0c;适用于备份和灾难恢复。通过…

陈零九全新单曲《也曾想走进你的心底》 揭露爱而不得的情感遗憾

图片提供&#xff1a;种子音乐 “创作男神”陈零九于10月9日推出充满深情的全新创作单曲《也曾想走进你的心底》&#xff0c;这首歌再次延续他招牌的“九式情歌”风格&#xff0c;展现其创作魅力。歌曲以一段“爱而不得”的感情故事为主线&#xff0c;深入探讨人们在爱情中的复…

java家政预约上门系统源码,家政服务平台源码,基于SpringBoot框架,数据库使用MySQL,界面渲染采用Thymeleaf技术开发

自主知识产权的家政预约上门系统源码&#xff0c;java版本&#xff0c;支持二次开发&#xff0c;适合商用上项目。 在这个快节奏的现代生活中&#xff0c;越来越多的家庭开始寻求高效、便捷的家政服务解决方案。传统的家政服务模式已经很难满足人们日益增长的个性化与即时性需求…

GAMES202作业3

EvalDiffuse 对于一个diffuse的着色点&#xff0c;它的BRDF为&#xff1a; /** Evaluate diffuse bsdf value.** wi, wo are all in world space.* uv is in screen space, [0, 1] x [0, 1].**/ vec3 EvalDiffuse(vec3 wi, vec3 wo, vec2 uv) {vec3 albedo GetGBufferDiffus…

【Linux】基本认知全套入门

目录 Linux简介 Linux发行版本 发行版选择建议 Centos-社区企业操作系统 Centos版本选择 Linux系统目录 Linux常用命令 SSH客户端 Linux文件操作命令 vim重要快捷键 应用下载与安装 netstat&#xff0c;ps与kill命令使用 Linux应用服务化 Linux用户与权限 Linu…

接口自动化测试实战

测试前准备&#xff1a; 1、项目的介绍 是一个什么项目、项目技术、项目要测的接口和业务流程、业务路径测试用例&#xff08;通过业务流程来梳理业务路径&#xff09; 2、链接和登录密码&#xff1a; 客达天下http://huike-crm.itheima.net/#/clue 客达天下账号admin&…

支持向量机-笔记

支持向量机&#xff08;Support Vector Machine, SVM&#xff09; 是一种强大的监督学习算法&#xff0c;广泛应用于分类和回归任务&#xff0c;特别是在分类问题中表现优异。SVM 的核心思想是通过寻找一个最优超平面&#xff0c;将不同类别的数据点进行分割&#xff0c;并最大…

【YOLO学习】YOLOv4详解

文章目录 1. 整体网络结构1.1 结构图1.2 创新点概括 2. 输入端创新点2.1 Mosaic数据增强2.2 cmBN策略 3. Backbone创新点3.1 CSPDarknet533.2 Mish函数3.3 Dropblock正则化 4. Neck创新点4.1 SPP模块4.2 PAN 5. Prediction5.1 Loss5.2 NMS 1. 整体网络结构 1.1 结构图 1.2 创新…