【蓝桥杯】每天一题,理解逻辑(1/90)【Leetcode 移动零】

文章目录

题目解析

题目链接:https://leetcode.cn/problems/move-zeroes/description/

  1. 题目意思解析
  • 把所有的零移动到数组的末尾
  • 保持非零元素的相对顺序
    理解了这两层的含义,这道题也就完成一半了。

讲解算法原理

解题思路:

题目归类数组划分:将一个数组划分成若干个区间

解题方法:

【双指针算法思路】

(数组下标充当指针)

定义两个指针:dest,cur。

  • cur:从左往右扫描数组
  • dest :已处理区间内,非零元素的最后一个一个位置
    作用:两个指针可以划分成三个区间
  • (0,dest) :非0区间
  • (dest+1,cur-1):0区间
  • (cur,n-1):待处理区间

如何划分和执行

  • cur初始化0,dest初始化-1

  • cur从左向右遍历,遇到0元素不做处理,遇到非0元素时,让dest+1,然后非零元素与dest所指元素进行交换(将非零元素直接归类到【0,dest】)

  • cur遍历到n-1时,结束

过程大致

联想思想:快排

  • cur指针先行遍历寻找非零元素
    • 零元素:不做处理,往后遍历
    • 非零元素:让dest++,然后dest所指向元素和cur元素进行交换
  • 当cur遍历到数组末尾时候,结束。

代码详情

  • C
c 复制代码
`void swap(int*nums,int a,int b)
{
    int tmp=0;
    tmp=nums[a];
    nums[a]=nums[b];
    nums[b]=tmp;
}
void moveZeroes(int* nums, int numsSize) {
    int n=numsSize;
    int dest=-1;
    for(int cur=0;cur<numsSize;cur++)
    {
        if(nums[cur])
        {
            swap(nums,dest+1,cur);
            dest++;
        }
    }
    
}`
  • C++
cpp 复制代码
`class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        for(int cur=0,dest=-1;cur<nums.size();cur++)
        {
            if(nums[cur])
            {
                swap(nums[++dest],nums[cur]);
            }
        }
        
    }
};
相关推荐
小羊在奋斗10 分钟前
【LeetCode 热题 100】二叉树的最大深度 / 翻转二叉树 / 二叉树的直径 / 验证二叉搜索树
算法·leetcode·职场和发展
2301_794461571 小时前
力扣-283-移动零
算法·leetcode·职场和发展
编程绿豆侠1 小时前
力扣HOT100之二叉树:98. 验证二叉搜索树
算法·leetcode·职场和发展
技术流浪者1 小时前
C/C++实践(十)C语言冒泡排序深度解析:发展历史、技术方法与应用场景
c语言·数据结构·c++·算法·排序算法
I AM_SUN2 小时前
98. 验证二叉搜索树
数据结构·c++·算法·leetcode
珊瑚里的鱼4 小时前
【滑动窗口】LeetCode 1658题解 | 将 x 减到 0 的最小操作数
开发语言·c++·笔记·算法·leetcode·stl
进击的小白菜5 小时前
用Java实现单词搜索(LeetCode 79)——回溯算法详解
java·算法·leetcode
珂朵莉MM5 小时前
2024 睿抗机器人开发者大赛CAIP-编程技能赛-专科组(国赛)解题报告 | 珂学家
开发语言·人工智能·算法·leetcode·职场和发展·深度优先·图论
少了一只鹅5 小时前
字符函数和字符串函数
c语言·算法
双叶8366 小时前
(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)
c语言·javascript·数据结构·html·json