首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >双指针

双指针

原创
作者头像
Undoom
发布2025-01-26 09:57:17
发布2025-01-26 09:57:17
2940
举报

88.合并两个有序数组--写双指针

https://leetcode.cn/problems/merge-sorted-array/description/

image.png
image.png
代码语言:C
复制
//定义两个指针
//一个指向 nums1 的有效部分的末尾(即 m-1)。
//另一个指向 nums2 的末尾(即 n-1)。
//从 nums1 的最后一个位置开始填充,即从 m+n-1 位置开始。
//比较 nums1 和 nums2 中的当前元素,将较大的元素放入 nums1 的最后位置
//不断移动指针,直到其中一个数组的所有元素都被处理完。
//如果 nums2 中还有剩余的元素(nums1 本身的前面可能已经是有序的),直接将 nums2 中剩下的部分复制到 nums1 中。


//nums1的初始长度就是m+n
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int p1=m-1;//nums1最后一个有效元素的下标
    int p2=n-1;//nums2最后一个有效元素的下标
    int p=m+n-1;//这个是nums1的总长度的末尾

    //从后往前进行合并操作
    while(p1>=0&&p2>=0)//循环停止的条件,只要两个数组中都存在未处理的元素的话,就可以继续进行合并的执行操作
    {
        //因为给我们的nums1和nums2都是递减的数组,是有序的
        

        //每次比较的时候将两组中大的元素放到p的位置
        if(nums1[p1]>nums2[p2])
        {
            nums1[p]=nums1[p1];
            p1--;
        }
        else
        {
            nums1[p]=nums2[p2];
            p2--;
        }
        p--;//放下一个元素,这里是换位置
    }
    //到这里的话肯定nums1的指针已经是出界了,不满足循环条件了,但是现在nums2hiatus有元素存在的,那么我们就直接将nums2中剩下的的元素直接复制到nums1中
    while(p2>=0)
    {
        nums1[p]=nums2[p2];
        p2--;
        p--;
    }
}

283.移动零--写双指针

https://leetcode.cn/problems/move-zeroes/description/

image.png
image.png

这类题可以分为数组划分或者叫做数组分块

解决这类题我们首先就想到了双指针算法

这里的指针是利用数组下标来充当指针

因为在数组中我们可以利用下标索引到对应的元素

我们定义的两个指针一个是dest 一个是cur

两个指针的作用

cur:从左往右扫描数组---遍历数组

dest:已处理的区间内,非0元素的最后一个位置

cur在扫描后会将数组分为两个区间,一个是左边,一个是右边,右边就是待处理的区间,左边就是处理过的

然后再cur处理过的左区间,我们的dest在里面又区分了两个区间,左边的就是非0元素,右边的就是0

所以上面会说dest是已处理的区间内,非0元素的最后一个位置

所以这两个指针将整个数组划分为三个部分

image.png
image.png

三个区间:

0,dest cur,n-1

非0元素 0 待处理

现在我们的数组有n个元素,那么一开始的下标是0,最后的下标是n-1

那么当我们的cur走到了n的位置,那么就说明整个数组我们已经处理完成了

那么就是说这个待处理的区间已经没了

那么这个时候就是说明整个区间被dest划分为两个区间了

一开始我们让cur指向第一个元素,因为一开始我们没有开始扫描没有非0元素,所以让dest先指向-1下标这个元素

我们先让cur进行从左往右的扫描操作

当我们的cur遇到0元素的时候cur直接向后移动一位就行了

如果我们的cur碰到非0元素的话

先让dest++,然后让cur位置和dest位置的元素进行交换的操作

如何做到cur从前往后遍历的过程中

1.遇到0元素:cur++

2.遇到非0元素:swap(dest+1,cur)

dest++,cur++

代码语言:C
复制
class Solution {
public:
    void moveZeroes(vector<int>& nums)
    {
        for(int cur=0,dest=-1;cur<nums.size();cur++)
        {
            if(nums[cur])//当cur指向的数不等于0的话
            swap(nums[++dest],nums[cur]);//让dest自增1,增完之后正是我想要交换的
        }
    }
};

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 88.合并两个有序数组--写双指针
  • 283.移动零--写双指针
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档