栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

移动零(力扣热题HOT100 之 力扣283)java

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

移动零(力扣热题HOT100 之 力扣283)java

目录

一、题目描述

二、思路讲解

三、Java代码实现

三、代码优化


一、题目描述

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

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

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]


示例 2:

输入: nums = [0]
输出: [0]
 

提示:

1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
 

进阶:你能尽量减少完成的操作次数吗?

二、思路讲解

        我们可以统计一下nums各个位置前面分别有多少0,有n个0就把这个位置上的数向前移动n位 ,再把数组末尾空缺的位置补上0即可。

三、Java代码实现
class Solution {
    public void moveZeroes(int[] nums) {

        int len = nums.length;
        int []ling = new int[len];  //记录第i位前面有几个0
        int sum = 0;                //记录一共有几个0

        //记录第i位前面有几个0
        for(int i=0; i=len-sum; i--){
            nums[i] = 0;
        }
    }
}

        时间复杂度:        O(N)

        空间复杂度:        O(N)

三、代码优化

        时间复杂度已经足够优秀了,但是操作次数过多;空间复杂度还不够完美,能否减少空间的使用呢?

        这就需要用到双指针了。

        1、开始时两指针同时在最左边,然后左右指针同时右移去找零。

        2、当左指针指零时,右指针右移去找非零。

        3、当找到非零时,交换;

        4、左右指针再同时右移去找零(重复1,2,3直到右指针达到末尾)

class Solution {
    public void moveZeroes(int[] nums) {
        int n = nums.length, left = 0, right = 0;
        while (right 

        可以简化一下代码: 

class Solution {
    public void moveZeroes(int[] nums) {
        int n = nums.length, left = 0, right = 0;
        while (right < n) {
            if (nums[right] != 0) {
                swap(nums, left, right);
                left++;
            }
            right++;
        }
    }

    //交换
    public void swap(int[] nums, int left, int right) {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }
}

        时间复杂度:        O(N)

        空间复杂度:        O(1)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/992176.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号