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++;
            }
        }

    }
}
相关推荐
余额瞒着我当琳13 分钟前
算法修炼 chapter 2 双指针进阶、盛最多水的容器、有效三角形的个数、两数之和、三数之和、四数之和
算法
你压到我腿毛了66615 分钟前
C语言冒泡算法(Bubble sort)
c语言·数据结构·算法
devilnumber20 分钟前
Oracle 与 MySQL substr 函数差异总结
java·数据库·mysql·oracle
cfm_291430 分钟前
线程池阻塞队列
java·开发语言
坐吃山猪1 小时前
【多线程】ThreadPool线程池参数说明
java·网络
靠沿1 小时前
贪心算法专题(三)
算法·贪心算法
evans在进步1 小时前
Java 常用设计模式(二):装饰器、适配器、责任链、模板方法、策略与观察者
java·开发语言·设计模式
super大力张1 小时前
MOE基于结构的药物设计(七):Ligand R-Vectors——如何判断配体可以从哪里继续生长?
数据库·算法·cadd·moe·svl·基于结构的药物设计
jvmind_dev2 小时前
频繁 new JedisCluster 之后,对象池为什么回不去了?
java·后端
AKA__Zas2 小时前
文件 I/O(速通版
java·intellij-idea·学习方法