LeetCode 75 - 每日一题

283. 移动零 - 力扣(LeetCode)

题目描述

​ 给定一个数组,将0元素移动到数组末尾,其他元素保持相对顺序。要求不能引入额外的空间。

思路

  • 要求不能使用额外的空间,即对原数组进行修改
  • 双指针,一个nonZero指针用于指向非0元素的存储下标, 一个i指针遍历数组找出非0元素。找到非0元素存就行了。
  • 之后对剩余元素补0.
java
复制代码
class Solution { public void moveZeroes(int[] nums) { int nonZero = 0; // 将所有非零元素前移 for (int i = 0; i < nums.length; i++) { if (nums[i] != 0) { nums[nonZero++] = nums[i]; } } // 将剩余位置填充为零 for (int i = nonZero; i < nums.length; i++) { nums[i] = 0; } } }

优化写法

  • 使用双指针 + 交换
  • 一个nonZero 指针 指向非0元素存储的下标。
  • 一个i指针,从前向后遍历找出非0元素
  • 两个指针值交换,交换后给当前元素赋值为0,因为当前的值已经移动到前面了,该位置就是空的也就是0
java
复制代码
class Solution { public void moveZeroes(int[] nums) { int nonZero = 0; // 记录下一个非零元素应该放置的位置 for (int i = 0; i < nums.length; i++) { if (nums[i] != 0) { // 交换当前元素和nonZero位置的元素 int temp = nums[i]; nums[i] = 0; // 将当前位置设为0 nums[nonZero++] = temp; // 将非零元素放到前面 } } } }

我的更多题解:hnsqls/algorithm-ls: 数据结构,算法

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP