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

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


目录

  • 一、移除元素
      • 1.1 题目描述
      • 1.2 思路1 -- 偷鸡摸狗法
        • 代码实现
      • 1.3 思路二 -- 原地移除
        • 代码实现
  • 二、删除有序数组中的重复项
      • 2.1 思路
        • 代码实现
  • 三、合并有序数组
      • 3.1 题目描述
      • 3.2 思路
        • 代码实现

一、移除元素

1.1 题目描述

LeetCode链接:移除元素

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

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

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;
}

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

1.3 思路二 – 原地移除

可以使用双指针

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

【动画展示】

以样例1为例

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

代码实现

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/面试题】移除元素 + 删除有序数组中的重复项 + 合并有序数组_第5张图片

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

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

【LeetCode/面试题】移除元素 + 删除有序数组中的重复项 + 合并有序数组_第6张图片
【LeetCode/面试题】移除元素 + 删除有序数组中的重复项 + 合并有序数组_第7张图片

2.1 思路

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

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

【动图展示】

以样例1为例

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

代码实现

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/面试题】移除元素 + 删除有序数组中的重复项 + 合并有序数组_第9张图片

三、合并有序数组

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

3.1 题目描述

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

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;
}

你可能感兴趣的:(LeetCode,面试/笔试题,leetcode,算法,c++,学习)