【LeetCode/面试题】移除元素 + 删除有序数组中的重复项 + 合并有序数组

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:Leetcode + 面试/笔试
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注


一、移除元素

1.1 题目描述

LeetCode链接:移除元素

在这里插入图片描述

在这里插入图片描述

1.2 思路1 – 偷鸡摸狗法

为什么说是偷鸡摸狗法呢,首先这题是要原地移除所有数值等于 val 的元素。而这题我就偷偷开辟新空间来做,没想到过了hh

  1. 首先malloc一个新空间
  2. 把不等于val放到新空间里
  3. 最后再把新空间的值拷贝回原数组
代码实现
int removeElement(int* nums, int numsSize, int val)
{
    //1.malloc新空间
    int* tmp = (int*)malloc(sizeof(int) * numsSize);
    int src = 0; //遍历原数组
    int dest = 0;//
    //2.把不等于val移动到新数组
    while(src < numsSize)
    {
        if (nums[src] != val)
        {
            tmp[dest] = nums[src];
            dest++;
            src++;
        }
        else
            src++;
    }
    //3.将新空间元素拷贝到原数组
    memcpy(nums,tmp,sizeof(int) * dest);
    //4.释放新数组
    free(tmp);
    tmp = NULL;
    //返回元素个数
    return dest;
}

在这里插入图片描述

1.3 思路二 – 原地移除

可以使用双指针

  1. 创建2个指针分别为srcdest,并让它们指向数组中的第一个元素
  2. 接着让src去遍历数组
  3. 如果src != val,就把以src为下标的值赋给dest为下标,然后两指针分别向后走
  4. 如果src == val,就让src指向下一个元素

【动画展示】

以样例1为例

在这里插入图片描述

代码实现
int removeElement(int* nums, int numsSize, int val)
{
    int dest = 0,src = 0;
    while(src < numsSize)
    {
        if (nums[src] != val)
        {
            nums[dest] = nums[src];
            dest++;
            src++;
        }
        else
        {
            src++;
        }
       
    }
     return dest;
}

在这里插入图片描述

二、删除有序数组中的重复项

LeetCode链接:删除有序数组中的重复项

在这里插入图片描述
在这里插入图片描述

2.1 思路

这题的思路和上题的“原地删除”思路差不多

  1. 创建指针dest、src,让其分别指向下标为1和下标为0的位置
  2. 如果dest和src指向的下标元素相同,就让src往后走
  3. 如果不相等,先让dest往后走一步(其实是为了覆盖重复项)后再赋值,然后让src继续向后走(不明白后面有动图)

【动图展示】

以样例1为例

在这里插入图片描述

代码实现
int removeDuplicates(int* nums, int numsSize)
{
    int src = 1;
    int dest = 0;
    while (src < numsSize)
    {
        if (nums[dest] != nums[src])
        {
        	dest++;
            nums[dest] = nums[src];
            src++;
        }
        else
        {
            src++;
        }
    }
    return dest + 1;
}

在这里插入图片描述

三、合并有序数组

LeetCode链接:合并两个有序数组

3.1 题目描述

在这里插入图片描述

3.2 思路

这题就是纯纯合并有序数组的模板。思路可以参考这篇博客 —> 【算法基础】归并排序

代码实现
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int* tmp = (int*)calloc(n + m,sizeof(int));
    int i = 0;
    int j = 0;
    int k = 0;
    while (i < m && j < n)
    {
        if (nums1[i] > nums2[j])
        {
            tmp[k++] = nums2[j++];
        }
        else
        {
            tmp[k++] = nums1[i++];
        }
    }
    while (i < m)
    {
        tmp[k++] = nums1[i++];
    }
    while (j < n)
    {
        tmp[k++] = nums2[j++];
    }
    memcpy(nums1,tmp,sizeof(int) * (n + m));
    free(tmp);
    tmp = NULL;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值