算法每日一题 Day01|双指针解决移动零问题

题目名称(附链接)

移动零链接:https://leetcode.cn/problems/move-zeroes/description/

一、题目描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

二、思路

利用双指针法来进行解答。

第一步:我们先定义两个指针,一个是cur(从左向右遍历数组),一个是dest(已处理的区间的最后一个元素位置)


第二步:将数组分为三段,第一段数组下标:0,dest,第二段数组下标:dest+1,cur-1,第三段下标:cur,n-1。

第一段划分出来代表:这个区间是非0元素

第二段划分出来代表:这个区间是0元素

第三段划分出来代表:这个区间是未划分元素区间。


第三步:设置初始值

将dest指针初始位置设为-1;cur初始位置设为0。

如果cur指向的元素为0,cur++,后移,如果cur指向的元素为非0元素,让cur位置的元素和dest+1位置的元素进行交换。一直重复这个动作,直到cur走到数组长度的位置,就完成操作了。

三、关键点

  • 边界条件:注意指针位置的区间取值

四、代码(Java )

java 复制代码
class Solution {
    public void moveZeroes(int[] nums) {
        for (int cur = 0, dest = -1; cur < nums.length; cur++) {
            if (nums[cur] != 0) {
                int tmp = nums[cur];
                nums[cur] = nums[dest + 1];
                nums[dest + 1] = tmp;
                dest++;
            }
        }
    }
}

五、总结

五、总结

  • 这题属于什么类型?

    这道题属于数组处理中的双指针(或数组划分)问题,本质是通过控制指针来对数组进行原地调整。

  • 学到了什么套路?

    通过双指针将数组动态划分为"已处理区"和"未处理区",在遍历过程中不断调整元素位置,从而在不额外使用空间的情况下完成操作。同时也加深了对双指针在数组重排问题中应用的理解。

相关推荐
罗西的思考1 分钟前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(5)--- GRPO
人工智能·算法·机器学习
郑州光合科技余经理6 分钟前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程
richard_yuu22 分钟前
动态规划:强化学习的「数学基础」,从 MDP 到值迭代
深度学习·神经网络·算法·yolo·机器学习·动态规划
无序的浪35 分钟前
测试博客-基于微服务的在线判题系统
java·spring cloud·docker·微服务·测试·在线判题
mmmmath_338 分钟前
LeetCode.225.用队列实现栈
算法
Elaine33639 分钟前
数据结构与算法-程序
数据结构·python·算法·计算机基础·编程基础
2601_9657422242 分钟前
布局GEO AI本地营销,我重点看这几个细节
大数据·人工智能·算法·ai·新媒体运营
EatFan42 分钟前
AI Agent 上生产前先加三道闸门:审批、限权、可回放的工程实践
人工智能·python·算法·多智能体·ai agent·mcp·harness
思茂信息1 小时前
CST软件BCI仿真模型及仿真案例
开发语言·单片机·嵌入式硬件·算法·emc
xfan_me1 小时前
维修保养记录精准版 API 对接实战指南
java·大数据·python