283. 移动零
暴力解法
class Solution {
public void moveZeroes(int[] nums) {
/**
* 使用额外的数组存放非零元素
*/
int[] temp = new int[nums.length];
int index = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0){
temp[index++] = nums[i];
}
}
for (int i = 0; i < nums.length; i++) {
nums[i] = temp[i];
}
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(n)
*/
优化1——双指针法
class Solution {
public void moveZeroes(int[] nums) {
/**
* 不使用额外的空间,n指向左边非零子数组的后一位,i指向当前遍历元素
* 记录最后一个非零元素的位置
*/
int n = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0){
nums[n] = nums[i];
n++;
}
}
for (int i = n; i < nums.length; i++) {
nums[i] = 0;
}
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
优化2——不单独赋值后面的元素为零
class Solution {
public void moveZeroes(int[] nums) {
/**
* 每当遇到一个非零元素,就和第n个元素互换位置,n初始为0
* 这样所有的非零元素都会按顺序在前面,0全部被换到了后面
*/
int n = 0;
int temp = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0){
temp = nums[i];
nums[i] = nums[n];
nums[n] = temp;
n++;
}
}
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
优化3——减少交换元素的次数
class Solution {
public void moveZeroes(int[] nums) {
/**
* 每当遇到一个非零元素,就和第n个元素互换位置,n初始为0
* 这样所有的非零元素都会按顺序在前面,0全部被换到了后面
*/
int n = 0;
int temp = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0){
/**
* 如果数组都是非零元素,那么每次都会和自己交换
* 因此判断一下是否真的需要交换
*/
if (i != n) {
temp = nums[i];
nums[i] = nums[n];
nums[n] = temp;
}
n++;
}
}
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
https://leetcode-cn.com/problems/move-zeroes/