(C++)复写零--双指针法

简介: (C++)复写零--双指针法

个人主页:Lei宝啊

愿所有美好如期而遇


算法原理

双指针法,不一定是说就要使用指针,只是一种形象的说法,在数组中,我们一般将数组下标当做指针,这道题目我们仍然定义cur以及dest,当我们将cur和dest都定义在数组开始时,按照逻辑执行下去,那么遇到0时,后面的部分值会被覆盖,所以我们不能从左向右走,而是从右向左走,但是这样的话我们又怎么知道cur和dest的位置呢?我们看图示

图示

正常从左向右走,图示:

2就被覆盖了,但是我们先走下去(不考虑覆盖),看看cur和dest的最终位置:

当dest到达右边界时停止。

也就是说,我们可以先遍历找到指针位置,再倒过来复写,图示:

我们还有一种特殊情况,就是dest越过边界,到了size,那么我们就要先将数组下标为size-1的位置置0,因为size位置不能置0,是越界的,然后我们dest -= 2,cur--,接下来正常走就好。

代码

class Solution {
public:
    void duplicateZeros(vector<int>& arr) 
    {
        int cur = 0;
        int dest = -1;
        int n = arr.size();
        while(cur < n)
        {
            if(arr[cur] != 0)
            {
                dest++;
            }
            else
            {
                dest += 2;
            }           
            if(dest >= n - 1)
            {
                break;
            }
            cur++;
        }
        if(dest > n - 1)
        {
            arr[n - 1] = 0;
            dest -= 2;
            cur--;
        }
        while(cur >= 0)
        {        
            if(arr[cur] != 0)
            {
                arr[dest--] = arr[cur--];
            }
            else
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }             
        }     
    }
};


目录
相关文章
|
6天前
|
C++
两种解法解决 LeetCode 27. 移除元素【C++】
两种解法解决 LeetCode 27. 移除元素【C++】
|
7月前
|
算法
【算法专题突破】双指针 - 复写零(2)
【算法专题突破】双指针 - 复写零(2)
17 0
|
6天前
|
算法
优选算法|【双指针】|1089.复写零
优选算法|【双指针】|1089.复写零
|
6天前
|
算法
class039 嵌套类问题的递归解题套路【算法】
class039 嵌套类问题的递归解题套路【算法】
35 0
|
6天前
各种遍历方法以及注意点
各种遍历方法以及注意点
20 0
|
6天前
|
算法 C++
(C++)移动零--双指针法
(C++)移动零--双指针法
33 0
|
5月前
|
算法
insertionSoft(插入排序) 2.1-1 And 重写insertionSoft 2.1-2
insertionSoft(插入排序) 2.1-1 And 重写insertionSoft 2.1-2
19 0
|
5月前
|
算法 测试技术 C#
C++二分查找算法:132 模式解法二枚举2
C++二分查找算法:132 模式解法二枚举2
|
6月前
力扣 203.移除链表元素第二种解法
力扣 203.移除链表元素第二种解法
16 0
|
9月前
|
算法
使用遍历方法和分治法求两个数组的值
看似简单的姐数组中的最大值实际上体现了不同的思路本文将以比较数组大小为背景,分别展示普通算法和分治法,通过对比来简述分治法。 问题描述 给定一个整数数组,编写一个算法来找到数组中的最大值和最小值。
47 0