283. Move Zeroes
原题链接:https://leetcode.com/problems/move-zeroes/description/
代码如下:
import java.util.Arrays;
/**
* Created by clearbug on 2018/2/26.
*/
public class Solution {
public static void main(String[] args) {
Solution s = new Solution();
int[] nums = new int[]{1, 0};
s.moveZeroes3(nums);
System.out.println(Arrays.toString(nums));
}
/**
* 方法一:这是我根据题目要求想出来的双指针方法,而且 Related Topics 里面也提到了 Two Pointers。然后提交结果是:10.10%,这结果
* 让我很尴尬😓啊。好吧,我分析了一下,我这方法确实有点蠢,下面👇我就想到了方法二
*
* @param nums
*/
public void moveZeroes1(int[] nums) {
for (int i = 0; i < nums.length; i++) {
int j = i + 1;
if (nums[i] == 0) {
while (j < nums.length && nums[j] == 0) {
j++;
}
if (j == nums.length) {
break;
}
nums[i] = nums[j];
nums[j] = 0;
}
}
}
/**
* 方法二:好吧,这个方法也并不是我想出来的,只是我脑子中闪现过这种思路罢了,但终究是没能写出实现来。这个实现还是抄袭提交区别人的答案。
* 拿这个方法和方法一对比,可以看出方法一效率低的原因就是因为它的 j 指针进行了很多无谓的回溯,下面方法三就是对方法一所做的改进,效率大大
* 提升了,但是代码确实丑了。。。
* @param nums
*/
public void moveZeroes(int[] nums) {
if (nums == null || nums.length < 2) {
return;
}
int k = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
int temp = nums[k];
nums[k] = nums[i];
nums[i] = temp;
k++;
}
}
}
// 对方法一所做改进。提交结果:beats 79.70%
public void moveZeroes3(int[] nums) {
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 0) {
if (j < i) {
j = i + 1;
}
while (j < nums.length && nums[j] == 0) {
j++;
}
if (j == nums.length) {
break;
}
nums[i] = nums[j];
nums[j] = 0;
}
}
}
// 官方方法一:都不符合题目要求的解答就不说了,思路就是借助额外的空间来实现啦
// 官方方法二:就是上面👆说的方法二的思路,只是不够最优罢了
// 官方方法三:就是上面👆说的方法二了
}

浙公网安备 33010602011771号