力扣-283-移动零

1.题目描述

2.题目链接

283. 移动零 - 力扣(LeetCode)

3.题目代码

java 复制代码
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作为临界值,来进行数组的划分。

相关推荐
向左转, 向右走ˉ15 分钟前
为什么分类任务偏爱交叉熵?MSE 为何折戟?
人工智能·深度学习·算法·机器学习·分类·数据挖掘
霜绛1 小时前
机器学习笔记(四)——聚类算法KNN、Kmeans、Dbscan
笔记·算法·机器学习·kmeans·聚类
晨非辰2 小时前
#C语言——学习攻略:深挖指针路线(三)--数组与指针的结合、冒泡排序
c语言·开发语言·数据结构·学习·算法·排序算法·visual studio
zzywxc7872 小时前
编程算法在金融、医疗、教育、制造业等领域的落地案例
人工智能·算法·金融·自动化·copilot·ai编程
zzywxc7872 小时前
编程算法在金融、医疗、教育、制造业的落地应用。
人工智能·深度学习·算法·机器学习·金融·架构·开源
conkl3 小时前
构建 P2P 网络与分布式下载系统:从底层原理到安装和功能实现
linux·运维·网络·分布式·网络协议·算法·p2p
Shan12053 小时前
递归算法的一些具体应用
算法
GSDjisidi4 小时前
日本IT就职面试|仪容&礼仪篇分享建议
面试·职场和发展
paopaokaka_luck5 小时前
婚纱摄影管理系统(发送邮箱、腾讯地图API、物流API、webSocket实时聊天、协同过滤算法、Echarts图形化分析)
vue.js·spring boot·后端·websocket·算法·echarts
愚戏师6 小时前
机器学习(重学版)基础篇(算法与模型一)
人工智能·算法·机器学习