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

    }
}
相关推荐
碧海银沙音频科技研究院2 小时前
炬芯ATS3089X手表的HFP通话不自动路由到设备BT的问题解决
网络·人工智能·嵌入式硬件·算法
Joy T4 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
m0_587383007 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
mmmmath_37 小时前
LeetCode.199.二叉树的右视图
数据结构·leetcode
·云扬·7 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
专注仿真7 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
码爸7 小时前
支持向量机介绍与示例
算法·机器学习·支持向量机
怕浪猫8 小时前
2028编程圈很火的10个Skills
算法·面试·github
代码不停8 小时前
自动化测试(java)
java·开发语言·selenium·自动化