移除元素、合并两个有序数组(leetcode)

简介: 移除元素、合并两个有序数组(leetcode)

一、移除元素

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路一:

比较好想到,但是时间复杂度为O(n^2)。

思路:把每一个数组中的元素与val比较,比较后若元素等于val,则创建一个新的数组,新的数组中删除了这个元素,其他所有元素都往前移一位,此时生成的数组大小为O(n-1)。所以最坏情况是每个元素都是val,则时间复杂度为:

(n-1)+(n-2)+(n-3)+……+1 = (n-1)*n/2,为O(n^2)。

思路二:

以空间换时间

思路三:

  • while(src<numsSize) 使用一个 while 循环来遍历数组。循环的条件是 src 必须小于 numsSize,以确保不会越界。
  • if(nums[src]!=val) 如果当前 src 指向的元素不等于给定的值 val,则执行以下操作:
  • nums[dst] = nums[src];将当前 src 指向的元素值复制到 dst 指向的位置。这样,所有不等于 val 的元素都会被移动到数组的前部。
  • src++;增加 src 的值以移动到数组的下一个元素。
  • dst++;增加 dst 的值以指向下一个应该放置非 val 值的位置。
  • else { ++src; }如果当前元素等于 val,则只增加 src 的值以移动到数组的下一个元素,而 dst 保持不变。这样确保了所有等于 val 的元素都被跳过,不会被复制到新的位置。

如果该元素不等于给定的值 val,则将该元素复制到 dst 指向的位置,并递增这两个指针。

如果该元素等于给定的值 val,则只递增 src 指针,因为你不希望复制该值。

当遍历完整个数组后,dst 的值就是新数组的长度(不包括要删除的元素)。

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

二、合并两个有序数组

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

可以使用归并排序,从后往前比较

  • 初始化指针:首先,我们初始化三个指针,end1、end2和end,分别指向nums1、nums2的末尾和合并后数组的末尾。
  • 比较和合并:然后,我们进入一个循环,该循环会持续进行,直到end1或end2小于0(也就是说,直到一个数组的所有元素都被合并到另一个数组中)。在每次循环中,我们都会比较nums1[end1]和nums2[end2],然后将较大的值放到nums1[end],并将相应的指针减1这样做的目的是确保我们在每次迭代中都将正确的值放在正确的位置,并保持数组的有序性。
  • 处理剩余元素:在第二步完成后,我们可能会发现nums2中还有一些元素没有被合并到nums1中。这是因为我们在第二步中只处理了nums1和nums2中都有的元素,而没有处理可能存在的剩余元素。因此,我们需要再进行一个循环,将nums2中的剩余元素复制到nums1中。注意,我们不需要处理nums1中的剩余元素,因为它们已经在正确的位置了。
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
  int end1 = m - 1;
  int end2 = n - 1;
  int end = m + n - 1;
  while (end1 >= 0 && end2 >= 0) {
    if (nums1[end1] > nums2[end2])
    {
      nums1[end] = nums1[end1]; 
      --end;
      --end1;
        }
        else
    {
      nums1[end] = nums2[end2];
        --end;
        --end2;
    }
  }
  // 如果是end1没完,不需要处理,因为就是在nums1里面
  while (end2 >= 0)
  {
    nums1[end] = nums2[end2];
    --end;
    --end2;
  }
}
相关文章
|
2月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
36 1
|
2月前
leetCode(删除有序数组中的重复项)
如何在不使用额外空间的情况下,通过双指针法原地删除有序数组中的重复项。
38 2
|
2月前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
35 0
|
2月前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
41 0
|
2月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
31 0
|
2月前
【LeetCode-每日一题】移除元素
【LeetCode-每日一题】移除元素
32 0
|
4月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
4月前
|
算法
LeetCode第88题合并两个有序数组
文章分享了LeetCode第88题"合并两个有序数组"的解法,通过从后向前的合并策略避免了数组元素的前移,使用三个指针高效地完成了合并过程。
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
123 2