LeetCode刷题(4)【移除元素&合并两个有序数组】(C语言)(含图解)

简介: LeetCode刷题(4)【移除元素&合并两个有序数组】(C语言)(含图解)

移除元素

典型双指针玩法。

27. 移除元素 - 力扣(LeetCode) (leetcode-cn.com)


我们都会想到这样的解法:从前面依次往后推,是val就将该数据后面的元素依次覆盖上来,但是这样的时间复杂度是O(n²),最坏的结果是一个数组中大部分数据都是val。

所以我们想到另一种解法,以空间换时间 ,另开一个数组,把不是val的数据给新的数组,再把新数组的值拷贝回来。空间复杂度是O(n)。

但是这个题它不让开辟一个新的数组,所以我们还得换一个思路。


该思路空间复杂度为O(n),时间复杂度为O(1)。——双指针解法
定义两个指针,p1和p2,p1先动,p2后动,如果p1不等于val,就把值传给p2,直到完成一遍遍历,p2的值就是新数组元素的个数。

如图所示:

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

int removeElement(int* nums, int numsSize, int val){
    int p1 = 0;
    int p2 = 0;
    //p1和p2都从数组左边出发
    while(p1 < numsSize)
    {
        //如果p1(对应的值)不等于val
        if(nums[p1] != val)
        {
            //将p1的值赋给p2
            nums[p2] = nums[p1];
            //往后面++
            p1++;
            p2++;
        }
        //p1(对应的值)等于val
        //只有p1走
        else
        {
            p1++;
        }
    }
    return p2;
}

就是p1在前面开路,p2在后面跟着,同时出发,p1遇到val就跳过,p2就停住,当p1没遇到val的时候将p1的值给p2,(就把p1位置的val值覆盖了),然后p1,p2都往后走一位......

合并两个有序数组

88. 合并两个有序数组 - 力扣(LeetCode) (leetcode-cn.com)
在这里插入图片描述
可以把num2直接放到num1后面,然后再进行升序排列,只不过效率有点低了。

所以我们采用下面这种解法。

num1和num2都从后往前走,取大的往后面放。

如图所示:

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

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
    //题目所给的nums1Size和num2Size没用
{
    int end1 = m-1;
    int end2 = n-1;
    int end = m+n-1;
    //end1和end2都还没有结束
    while(end1 >= 0 && end2 >= 0)
    {
        //把他们两个中大的放在后面
        if(nums1[end1] > nums2[end2])
        {
            nums1[end] = nums1[end1];
            end--;
            end1--;
        }
        else
        {
            nums1[end] = nums2[end2];
            end--;
            end2--;
        }
    }
    //如果end2先结束,就是num2里面已经没有元素了,那就不需要处理了,因为就是往num1里面放的
    //但是,如果是end1先结束了,还需要处理一下,因为此时num2里面还有元素没有放进num1里面
    while(end2 >= 0)
    {
        nums1[end] = nums2[end2];
        end--;
        end2--;
    }
}

在这里插入图片描述

相关文章
leetCode(删除有序数组中的重复项)
如何在不使用额外空间的情况下,通过双指针法原地删除有序数组中的重复项。
135 2
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
10月前
|
Go 索引 Perl
【LeetCode 热题100】【二叉树构造题精讲:前序 + 中序建树 & 有序数组构造 BST】(详细解析)(Go语言版)
本文详细解析了二叉树构造的两类经典问题:通过前序与中序遍历重建二叉树(LeetCode 105),以及将有序数组转化为平衡二叉搜索树(BST,LeetCode 108)。文章从核心思路、递归解法到实现细节逐一拆解,强调通过索引控制子树范围以优化性能,并对比两题的不同构造逻辑。最后总结通用构造套路,提供进阶思考方向,帮助彻底掌握二叉树构造类题目。
668 9
LeetCode第26题删除有序数组中的重复项
这篇文章介绍了LeetCode第26题"删除有序数组中的重复项"的解题方法,通过使用双指针技巧,高效地去除数组中的相邻重复元素。
LeetCode第26题删除有序数组中的重复项
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
294 1
LeetCode第80题删除有序数组中的重复项 II
文章介绍了LeetCode第80题"删除有序数组中的重复项 II"的解法,利用双指针技术在O(1)空间复杂度内原地删除重复元素,并总结了双指针技术在处理有序数组问题中的应用。
LeetCode第80题删除有序数组中的重复项 II
LeetCode第88题合并两个有序数组
文章分享了LeetCode第88题"合并两个有序数组"的解法,通过从后向前的合并策略避免了数组元素的前移,使用三个指针高效地完成了合并过程。
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
155 0
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
152 0
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
275 0
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍

热门文章

最新文章