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的值就是新数组元素的个数。
如图所示:
1 | int removeElement(int* nums, int numsSize, int val){ |
就是p1在前面开路,p2在后面跟着,同时出发,p1遇到val就跳过,p2就停住,当p1没遇到val的时候将p1的值给p2,(就把p1位置的val值覆盖了),然后p1,p2都往后走一位……
合并两个有序数组
88. 合并两个有序数组 - 力扣(LeetCode) (leetcode-cn.com)
可以把num2直接放到num1后面,然后再进行升序排列,只不过效率有点低了。
所以我们采用下面这种解法。
num1和num2都从后往前走,取大的往后面放。
如图所示:
1 | void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 半生瓜のblog!