题干
给定一个数组
nums
,编写一个函数将所有0
移动到数组的末尾,同时保持非零元素的相对顺序。示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路 1
首先,最简单的思路肯定暴力法
声明一个和原始数组等长(nums.length)的新数组;遍历原始数组(i);非0则给新数组赋值(j)。
最后返回新数组。
但题目中要求必须在原数组上进行操作,不能拷贝额外的数组。
所以复制粘贴一下就行了。
class Solution {
public void moveZeroes(int[] nums) {
int[] temps=new int[nums.length];
int j=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=0)
{
temps[j]=nums[i];
j++;
}
}
for(int k=0;k<nums.length;k++){
nums[k]=temps[k];
}
}
}
提交时间 | 提交结果 | 运行时间 | 内存消耗 | 语言 |
---|---|---|---|---|
几秒前 | 通过 | 0 ms | 38.6 MB | Java |
思路 2
如果严格按照题目要求
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
那么就不能申请额外的空间,所以我们考虑使用两个指针下标来对一个数组进行操作。
基本思路还是和前面一致,一个指针按照正常遍历顺序迭代,另一个指针参照思路1中新建链表方式(有非0值就覆盖,自身指针移动,没有非0值就等待快速指针的遍历(相当于思路1中对原始数组的遍历))
class Solution {
public void moveZeroes(int[] nums) {
int fast=0;
int slow=0;
for(;fast<nums.length;fast++){
//快速找到非0元素
if(nums[fast]==0){
fast++;
}
//在不超出空间的情况且找到非0元素时
if(fast<nums.length&&nums[fast]!=0){
//覆盖慢指针的值,慢指针++
//这一步就类似于暴力破解思路中,对于新建数组的操作(非0则覆盖,迭代)
nums[slow]=nums[fast];
slow++;
}
}
//当遍历完以后,对慢指针后续的值都设置为0
while(slow<nums.length){
nums[slow]=0;
slow++;
}
}
}
提交时间 | 提交结果 | 运行时间 | 内存消耗 |
---|---|---|---|
21 分钟前 | 通过 | 0 ms | 38.4 MB |