27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)下

简介: 27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)下

26. 删除有序数组中的重复项

bfa9f908c0714348bce4538f64b1b21e.png


这道题的思想与上一题思维类似,也是运用双指针遍历法


这道题的做法是:

定义2个指针,一个作为des指向第一个元素,一个作为src指向第二个元素

如果des与src指向的元素相同,就src++

如果des与src指向的元素不同,因为此前des已经保存了之前的值,所以先des++,再把src的值放到des中,再src++


代码如下:


int removeDuplicates(int* nums, int numsSize){
    int src = 1;
    int des = 0;
    while(src<numsSize)
    {
        if(nums[src]==nums[des])
        {
            src++;
        }
        else
        {
             nums[++des] = nums[src++];
        }
    }
    return des+1;
}


88. 合并两个有序数组



37a366b76ccc42a4a4fb9b9625e2253e.png


合并2个有序数组,这里可以使用归并排序的思想,但是这题与归并思想有些区别


这道题是把值最后都归到数组nums1中,如果还是按照归并做法从前往后操作则会覆盖的值

所以这道题我们从后往前归并



cf630e17ebb64a9e9ccd241d6260adae.png


在begin1和begin2中选出较大的值,放到des中,然后des--,以及对应元素较大的那个begin减1


接着还有个问题:


如果begin2先循环完,因为数组都是有序的,所以这是已经合并结束

如果begin1先循环完,nums2中的部分数据可能还没有合并到nums1中,所以这里可以把nums2中的元素拷贝到nums1中,拷贝的个数其实是des+1

代码如下:


void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int des = nums1Size-1;
    int begin1 = m-1;
    int begin2 = n-1;
    while(begin1>=0&&begin2>=0)
    {
        if(nums1[begin1]>nums2[begin2])
        {
            nums1[des] = nums1[begin1];
            begin1--;
            des--;
        }
        else if(nums1[begin1]<=nums2[begin2])
        {
            nums1[des] = nums2[begin2];
            begin2--;
            des--;
        }
    }
    if(begin2<0)
    {
        return;
    }
    else if(begin1<0)
    {
        memmove(nums1,nums2,sizeof(int)*(des+1));
    }
}


下面还有一个牛客网的题,也是运用双指针(下标)遍历法

牛客网:BC98 序列中删除指定数字


46fff938c054412d98a7151935824914.png





代码如下:


#include <stdio.h>
int main()
{
    //输入各个值
    int N= 0;
    scanf("%d",&N);
    int arr[N];
    for(int i=0;i<N;i++)
    {
        scanf("%d",&arr[i]);
    }
    int val = 0;
    scanf("%d",&val);
    //删除指定数字
    int des = 0;
    for(int src=0;src<N;src++)
    {
        if(arr[src]!=val)
        {
            arr[des] = arr[src];
            des++;
        }
    }
    //输出修改后的序列
    for(int i = 0;i<des;i++)
    {
        printf("%d ",arr[i]);
    }
}


目录
相关文章
|
2月前
|
存储 算法 C语言
通过指针引用数组元素
通过指针引用数组元素
21 0
|
2月前
|
C语言 C++
数组元素的指针
数组元素的指针
10 0
|
2月前
|
算法
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
|
2月前
|
存储 安全 Java
防止数组元素的指针被修改
防止数组元素的指针被修改
15 1
|
2月前
|
算法 搜索推荐
LeetCode刷题---215. 数组中的第K个最大元素(双指针,快速选择)
LeetCode刷题---215. 数组中的第K个最大元素(双指针,快速选择)
|
2月前
LeetCode刷题---80. 删除有序数组中的重复项 II(双指针)
LeetCode刷题---80. 删除有序数组中的重复项 II(双指针)
|
2月前
LeetCode刷题---26. 删除有序数组中的重复项(双指针)
LeetCode刷题---26. 删除有序数组中的重复项(双指针)
|
4月前
|
存储 搜索推荐 Serverless
用指针和动态内存分配的方法输入10,2,30, 4,5,按输入顺序逆置排序,输出排序后的元素,即输出5,4,30,2,10
用指针和动态内存分配的方法输入10,2,30, 4,5,按输入顺序逆置排序,输出排序后的元素,即输出5,4,30,2,10
19 0
|
4月前
|
C语言
【C语言】数组元素:带方括号的下标形式和指针形式
【C语言】数组元素:带方括号的下标形式和指针形式
20 0
|
5月前
|
存储
【每日一题Day294】LC88合并两个有序数组 | 双指针
【每日一题Day294】LC88合并两个有序数组 | 双指针
17 0