原题链接:https://leetcode-cn.com/problems/move-zeroes/
关键信息:
- 将0移动到数组后方
- 保证非零元素相对位置
- 必须原地修改
解法类似于选择排序,从第1个0元素开始,向后找直到第1个非0元素,交换两者位置之后,接着移动到第2个0元素继续向后找非0元素两者交换,依次类推,直到所有数据找完为止。
但是如果按照上述步骤套用选择排序的代码去做的话,其时间复杂度为O(n^2),操作次数过多,我们可以稍微优化一下
创建指针 k 从角标 0 开始, k 的位置设定即为非0元素的位置,再从头寻找的非0元素,找到后与 k 位置交换即可 然后k++
动画效果如下:
代码如下:
class Solution {
public void moveZeroes(int[] nums) {
int k=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
int temp=nums[i];
nums[i]=nums[k];
nums[k]=temp;
k++;
}
}
}
}