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

【力扣】移动零,双指针法

移动零原题地址

方法一:传统双指针法

本题要求把非零元素移动到左边,零移动到右边,这跟快速排序的单趟非常相似。

定义左右指针 left 和 right , right 指针负责探测所有元素如果遇到非零元素,则左右指针交换,再同时右移;如果遇到零,则左指针不动,右指针右移

说人话就是:如果遇到非零元素,就把这个数换到左边,把左边的零换到右边;如果遇到零,那就不用管了,零就该待在右边。

// 方法一:双指针
class Solution
{
public:
    void moveZeroes(vector<int>& nums)
    {
        int n = nums.size();
        int left = 0;
        int right = 0;

        // 非零,交换数据,左右指针都往右移
        // 零,右指针右移
        while (right < n)
        {
            if (nums[right])
            {
                swap(nums[left], nums[right]);
                ++left;
            }

            ++right;
        }
    }
};

方法二:双指针的取巧实现

这道题可以用另一种方式理解。我们可以考虑把所有非零数都移动到左边,再在右边填充零

同样定义 left 和 right , right 负责探测所有元素,如果遇到非零元素,就把这个元素覆盖到 left 的位置,两个指针同时右移;如果遇到零,左指针不动,右指针右移。

这样,我们就把所有的非零元素移动到了左边,此时只要把 left 右边的位置都用零覆盖即可。

// 方法二:双指针的另一种取巧实现
class Solution
{
public:
    void moveZeroes(vector<int>& nums)
    {
        int n = nums.size();
        int left = 0;
        int right = 0;

        // 非零,覆盖到左边
        while (right < n)
        {
            if (nums[right])
            {
                nums[left++] = nums[right];
            }

            ++right;
        }

        // 后面全填零
        while (left < n)
        {
            nums[left++] = 0;
        }
    }
};


http://www.kler.cn/a/231727.html

相关文章:

  • MySQL的编程语言
  • Excel单元格中自适应填充多图
  • 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--完善TODO标记的代码
  • django解决跨域问题
  • 【计算机网络】协议定制
  • Visual Studio 2017 快捷键设置-批量注释和批量取消注释
  • 【开源】JAVA+Vue.js实现在线课程教学系统
  • 前端JavaScript篇之对闭包的理解
  • JSP页面组件
  • Vue事件中如何使用 event 对象
  • LRU和LFU有什么区别
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • 探索C语言中的联合体与枚举:数据多面手的完美组合!
  • 掌握虚拟化与网络配置之道:深入浅出VMware及远程管理技巧
  • 在Ubuntu上安装JetBrains Toolbox并解决libfuse.so.2依赖问题
  • 搭建macOS开发环境-1:准备工作
  • 显示器颜色显示技术原理
  • 3.0 Hadoop 概念
  • 堆排及时间复杂度分析
  • 2024.2.6日总结(小程序开发3)
  • 如何用 npm 运行本地 js 文件
  • 【doghead】VS2022 win11 安装配置WSL2 以编译linux端的cmake项目并运行2
  • 【网页设计期末】茶文化网站
  • ShardingSphere 5.x 系列【5】Spring Boot 3 集成并实现读写分离
  • Maven之安装自定义jar到本地Maven仓库中
  • Java学习day30:Stream流入门、集合获取流对象、流对象的方法(知识点详解)