关于双指针解题

例一:除重算法。

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

思路:使用两个指针begin和end(从第二个元素开始),begin依次遍历数组中的每个元素。如果begin所指向的元素与前一个元素不同,则意味着这个数是第一次出现,将其放在end所指向的位置中,然后end向后挪一位,否则这个数就是重复数,end不变,begin++。

 

 

int removeDuplicates(int* nums, int numsSize)
{
     int* str = nums+1;
    int* dst = nums+1;
    int count = 1;
    for (str; str < nums+numsSize; str++)
    {
       if(*str!=*(str-1))
       {
           *dst=*str;
           dst++;
           count++;
       }
    }
    return count;
}

例二:合并两个有序数组。

给你两个按非递减排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你合并nums2 到 nums1 中,使合并后的数组同样按非递减顺序排列。

思路:最容易想到的方法:用两个指针控制遍历两个数组。比较指向的元素,把较小的那个放到前面,然后对应的指针加一。

但是因为需要把合并后的数放到nums1中,如果不使用中间临时存储数组,就不能使用双指针从头开始比较。因此我们可以从后往前遍历,先把最大值放到最后一个位置,依次向前遍历比较。

 如果nums1先遍历完成,nums2还会有一部分元素没有被合并,因此我们还需要再合并一次,直接把nums2中剩余的元素放到nums1数组的最前面。

 

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int* p1=nums1+m-1;
    int* p2=nums2+n-1;
    int* p3=nums1+nums1Size-1;
    while(p1>=nums1&&p2>=nums2)
    {
        if(*p1>*p2)
        {
            *p3=*p1;
            p1--;
            p3--;
        }
        else
        {
            *p3=*p2;
            p2--;
            p3--;
        }
    }
//用memcpy拷贝
   if(p2>=nums2)
    {
        memcpy(nums1,nums2,(p2-nums2+1)*4);
    }
//利用while循环
    /* while(p2>=nums2)
    {
        *p3=*p2;
        p2--;
        p3--;
    }*/
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值