热门

最新

红包

立Flag

投票

同城

我的

发布
wzh18907434168
Eliooooooo
3 年前
truewzh18907434168

每日一题
leetcode1089—复写零

给你一个长度固定的整数数组 `arr` ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 **就地** 进行上述修改,不要从函数返回任何东西。


示例 1:


输入:arr = [1,0,2,3,0,4,5,0]
输出:[1,0,0,2,3,0,0,4]
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]

解法一:双指针

先找到最后一个需要写进数组的元素,然后从后往前按照条件写,注意处理特殊情况——越界

时间复杂度:O(n)

空间复杂度:O(1)
void duplicateZeros(vector<int>& arr)
{
//1.查找最后一个写的元素
int cur = -1, dest = -1;
int sz = arr.size();
while (cur < sz)
{
if (arr[++cur]) dest++;
else dest += 2;
if(dest >= sz - 1) break;
}
//2.处理特殊情况——dest越界
if (dest == sz)
{
arr[--dest] = 0;
cur--;
dest--;
}
//3.从后往前复写
while (cur >= 0)
{
if(arr[cur]) arr[dest--] = arr[cur--];
else
{
arr[dest--] = 0;
arr[dest--] = 0;
cur--;
}
}
}

leetcode链接

每日学习打卡
CSDN App 扫码分享
分享
评论
2
打赏
  • 复制链接
  • 举报
下一条:
今天非常多的小伙伴因为文章关注了我,感谢大家的支持。
立即登录