LeetCode 算法题【简单】283. 移动零

语雀原文链接

1、LeetCode 链接

plain 复制代码
给定一个数组 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
 

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

2、个人写法

  • 思路:从头遍历数组,如果是0就将该元素和后面的第一个非零数字交换,这样保持非零元素的相对顺序
  • 时间复杂度:O(N2)
  • 空间复杂度:O(1)
plain 复制代码
class Solution {
    public void moveZeroes(int[] nums) {

        int length = nums.length;

        int last = length - 1;
        for (int i = 0; i < length; i++) {
            if (nums[i] == 0) {
                boolean allZero = true;
                for (int j = i + 1; j < length; j++) {
                    if (nums[j] != 0) {
                        allZero = false;
                        int temp = nums[i];
                        nums[i] = nums[j];
                        nums[j] = temp;
                        break;
                    }
                }
                if (allZero) {
                    break;
                }
            }
        }
    }
}

3、更优写法

  • 思路:遍历元素,第一个非零元素放在index=0位置,第二个非零元素放在index=1,依此类推
  • 时间复杂度:O(N)
  • 空间复杂度:O(1)
plain 复制代码
class Solution {
    public void moveZeroes(int[] nums) {

        int index = 0;

        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {

                if (index != i) {
                    // 交换位置
                    int temp = nums[i];
                    nums[i] = nums[index];
                    nums[index] = temp;
                }

                // 在此轮交换位置后, 下一次就应该将非零元素交换到下一个位置了
                index++;
            }
        }

    }
}
相关推荐
wydaicls1 小时前
C语言对单链表的操作
c语言·数据结构·算法
傻童:CPU1 小时前
C语言需要掌握的基础知识点之排序
c语言·算法·排序算法
计算机学姐4 小时前
基于微信小程序的高校班务管理系统【2026最新】
java·vue.js·spring boot·mysql·微信小程序·小程序·mybatis
一路向北⁢4 小时前
基于 Apache POI 5.2.5 构建高效 Excel 工具类:从零到生产级实践
java·apache·excel·apache poi·easy-excel·fast-excel
大数据张老师5 小时前
数据结构——邻接矩阵
数据结构·算法
低音钢琴6 小时前
【人工智能系列:机器学习学习和进阶01】机器学习初学者指南:理解核心算法与应用
人工智能·算法·机器学习
毕设源码-赖学姐7 小时前
【开题答辩全过程】以 基于Android的校园快递互助APP为例,包含答辩的问题和答案
java·eclipse
damo017 小时前
stripe 支付对接
java·stripe
麦麦鸡腿堡8 小时前
Java的单例设计模式-饿汉式
java·开发语言·设计模式
假客套8 小时前
Request method ‘POST‘ not supported,问题分析和解决
java