首页 > 其他分享 >LeetCode刷题(4)【移除元素&合并两个有序数组】(C语言)(含图解)

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

时间:2022-11-17 21:32:40浏览次数:80  
标签:p2 p1 end val int C语言 end2 移除 LeetCode


移除元素

典型双指针玩法。

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


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

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

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


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

如图所示:

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


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

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)​

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


可以把num2直接放到num1后面,然后再进行升序排列,只不过效率有点低了。

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

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

如图所示:

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


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

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


标签:p2,p1,end,val,int,C语言,end2,移除,LeetCode
From: https://blog.51cto.com/u_15333750/5866182

相关文章

  • LeetCode刷题(5)【链表】【环形链表II】(C语言)
    环形链表I​​LeetCode刷题(3)【链表】【环形链表】&扩展_半生瓜のblog-CSDN博客​​环形链表II142.环形链表II-力扣(LeetCode)(leetcode-cn.com)这个题写起来不难,但是证......
  • 【线性表】之栈(C语言)
    栈​​回顾​​​​栈​​​​结构定义​​​​初始化​​​​销毁​​​​入栈​​​​出栈​​​​返回栈顶元素​​​​返回栈中元素个数​​​​判断栈是否为空​​​​......
  • 【线性表】之队列(C语言)
    队列​​队列的概念​​​​结构定义​​​​初始化​​​​销毁​​​​队尾入​​​​队头出​​​​队头出​​​​队头数据​​​​队尾数据​​​​是否为空​​​​返......
  • LeetCode刷题(7)【栈&队列】用队列实现栈(C语言)
    用队列实现栈225.用队列实现栈-力扣(LeetCode)(leetcode-cn.com)目的:用队列实现栈,从先进先出——>先进后出,1234这四个数据依次从队列1的队尾进入,要让4先出,一个队列是无法......
  • LeetCode刷题(2)【链表】【合链表&链表的中间结点】(C语言)
    我的小站——半生瓜のblog快慢指针问题:思路:定义一个快指针和一个慢指针,快指针走到结束的时候,慢指针刚好走到一半。链表的中间结点。876.链表的中间结点-力扣(LeetCode)(le......
  • LeetCode刷题(3)【链表】【环形链表】&扩展(C语言)
    我的小站——半生瓜のblog环形链表141.环形链表-力扣(LeetCode)(leetcode-cn.com)什么是链表带环:链表的最后一个元素不指向空而指向前面的某个结点。思路:快慢指针,慢指针走......
  • C语言二级错题积累(4)
    在栈中,栈项指针的动态变化决定栈中元素的个数。详细设计的人物是为软件结构体中的每一个模块确定实现算法和局部数据结构,用某种选定的表达工具表示算法和数据结构的细节。扇......
  • C语言二级错题积累(5)
    常用的连续存储管理技术有固定分区存储管理和可变分区存储管理。程序流程图中带有箭头的线段表示的是控制流。若二叉树没有叶子结点,则为空二叉树。带链栈的栈底指针是随栈的......
  • C语言实现贪吃蛇小程序
    参考视频https://www.bilibili.com/video/BV1LN41197zV?from=search&seid=15462998985727977257代码有点缺陷:1.食物有可能会生成在吃不到的地方2.吃掉食物的音效添加失败//......
  • C语言实现推箱子小游戏
    C语言实现推箱子小游戏包括黑窗和图形界面参考视频https://www.bilibili.com/video/BV1By4y1a79o?t=4428BUG:当人进入到目的地的时候会无法移动。#include<stdio.h>#incl......