题目:移动0:
第一遍想法:
// Java算法
class Solution {
public void moveZeroes(int[] nums) {
int length=nums.length;
int temp;
for(int i=0;i<length;i++){
if(nums[i]==0){
temp=i;
for(int j=i+1;j<length;j++){
if(nums[j]!=0){
nums[temp]=nums[j];
nums[j]=0;
temp=j;
}
}
}
}
}
}
可是执行结果太慢了,时间复杂度为O(n2)
原因分析:
使用了嵌套循环,最容易想到但也是最慢的算法
解决方案:
使用双指针,单循环将非0数字移动到前面
设置第一个指针index,代表由此指针开始后面都是0,每找到一个非0数字就将该数字填到index位置,index后移一位;
相当于找到一个非0数字就把index假设0的数量减1,一遍遍历之后,该找到的非0都被移动到了前面,剩下的就都是0了,只需要再while循环将后续数字全设置为0即可;
图解:
代码:
class Solution {
public void moveZeroes(int[] nums) {
if(nums==null|| nums.length==0)return;
int index=0;
for(int i=0;i<nums.length;i++){ //一次遍历,把非零的都往前挪
if(nums[i]!=0){
nums[index++]=nums[i];
}
}
while(index<nums.length){ //后面的都是0
nums[index++]=0;
}
}
}
执行情况: