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

力扣-283-移动零

1.题目描述

2.题目链接

283. 移动零 - 力扣(LeetCode) 

3.题目代码

class Solution {public void moveZeroes(int[] nums) {int dest=-1;int cur=0;while(cur<nums.length){if(nums[cur]==0){cur++;}else if(nums[cur]!=0){swap(nums,cur,dest+1);cur++;dest++;}}}public void swap(int[]nums,int i, int j){int temp=0;temp=nums[i];nums[i]=nums[j];nums [j]=temp;}
}

4.解题思路

1.定义两个指针。

2.在遍历cur的过程中,数组也就被分成了三个部分:

 

3.dest初始值为-1,cur初始值为0。

在还没有开始遍历的时候,最左边非零的区间就是0,因为还没有判断数组首元素是否非零。所以dest的初始位置就应该是在-1,这样非零元素也就是【0,-1】,也就不存在。

如果dest指针从0开始,那此时非零区间就是【0,0】,0号下标的元素也就直接被判断为非零元素。 

而cur因为是进行遍历,所以cur从0开始。这是待处理区间是【0,nums.length-1】,也就是整个数组。

4.cur遍历数组

当cur遍历完数组后,也就是cur>=nums.length时,dest指针此时还在数组上,因此待处理区间:【cur,nums.length】就是空区间。

整个数组被dest指针分成了两个部分一个是非零区间:【0,dest】,一个是零区间:【dest+1,cur-1】。这里的cur-1就是数组的最后一个元素,cur-1=numslength-1。

这时,我们就完成了这道题目的要求:所有非零元素在数组的左边,零元素在数组的右边。

5.题目思想

这道题目的思想是使用双指针,将整个数组划分为3个区间,通过对一个指针进行遍历,来完成题目的要求。

值得一提的是,这道题目的思想和快速排序有异曲同工之妙。

快速排序的思想是:通过假定一个元素temp,将所有小于temp的元素放在temp的左边,所有大于等于temp的元素放在temp的右边。

这道题目的temp也就是0,通过0作为临界值,来进行数组的划分。 

相关文章:

  • 【leetcode】逐层探索:BFS求解最短路的原理与实践
  • Power BI Desktop开发——矩阵相关操作
  • 在Maven中使用Ant插件
  • 20250517让NanoPi NEO core开发板在Ubuntu core16.04.2下支持TF卡的热插拔
  • StarRocks MCP Server 开源发布:为 AI 应用提供强大分析中枢
  • Seata源码—5.全局事务的创建与返回处理一
  • 【AI生成PPT】使用ChatGPT+Overleaf自动生成学术论文PPT演示文稿
  • MySql进阶学习
  • PHP8.0版本导出excel失败
  • 长三角、珠三角、成渝、京津冀四大城市群的区域与分布
  • ubuntu安装google chrome
  • 如何在 Windows 10 或 11 上通过命令行安装 Node.js 和 NPM
  • 06、基础入门-SpringBoot-依赖管理特性
  • golang中的反射示例
  • Java二叉树题目练习
  • 项目QT+ffmpeg+rtsp(二)——海康威视相机测试
  • Rust 学习笔记:关于 HashMap 的练习题
  • PostGIS实现栅格数据入库-raster2pgsql
  • [Java][Leetcode simple] 13. 罗马数字转整数
  • SLAM定位常用地图对比示例
  • 2025年上海科技节开幕,人形机器人首次登上科学红毯
  • 乌克兰官员与法德英美四国官员举行会谈
  • 第一集|好饭不怕晚,折腰若如初见
  • 现场丨在胡适施蛰存等手札与文献间,再看百年光华
  • 上海虹桥国际咖啡文化节周五开幕,来看Coffeewalk通关攻略
  • 日本航空自卫队一架练习机在爱知县坠毁