链接:1089. 复写零 - 力扣(LeetCode)
算法原理:
解法:双指针算法
根据“异地”操作,然后优化成双指针下的“就地”操作
1.先找到最后一个“复写”的数
1.先判断 cur 位置的值
2.决定 dest 向后移动一步或者两步
3.判断一下 dest 是否已经到结束为止
4.cur++;
5.处理一下边界情况: n-1 = 0;
cur--;
dest -= 2;
2.“从后向前”完成复写操作
代码如下:
class Solution {
public void duplicateZeros(int[] arr) {
int cur = 0, dest = -1, n = arr.length;
//1.先找到最后一个需要复写的数
while(cur < n){
if(arr[cur] == 0){
dest += 2;
}else{
dest += 1;
}
if(dest >= n-1){
break;
}
cur++;
}
//2.处理一下边界情况
if(dest == n){
arr[n-1] = 0;
cur--;
dest -=2;
}
//3.从后向前完成复写
while(cur >= 0){
if(arr[cur] != 0){
arr[dest--] = arr[cur--];
}else{
arr[dest--] = 0;
arr[dest--] = 0;
cur--;
}
}
}
}
复杂度分析:
- 时间复杂度:O(n),虽然是两个while循环,但是常数部分可以忽略不计,相当于遍历一遍数组就完成了
- 空间复杂度:O(1)