前言
hello,大家好呀,我是Humble,今天的博客内容是关于之前分享过的顺序表的力扣OJ题,毕竟我们学了顺序表的知识也要做一些算法题目来强化嘛
好的,废话不多说,直接开始吧~
题目一
题目描述:
给你一个数组nums
和一个值val
,你需要 原地 移除所有数值等于val
的元素,并返回移除后数组的新长度
这道题让我们写一个函数,返回移除val后数组nums的新长度
Humble的思路一是:遍历数组,遇到等于val的元素,将val的元素之后的元素往前覆盖
这是一个常规的想法,但它需要两个for循环,外循环用来遍历数组,内循环去往前覆盖
可以有点麻烦了
有没有什么方法可以只使用一次for循环,那么就看下面的思路二吧~
Humble的思路二是:双指针法
何为双指针法? 这里的指针不是真的定义指针,而是两个变量
我们定义两个变量 src 和 dst 作为下标
我们让src找不等于val的值 , 如果src指向的值等于val -->src ,src++
如果src 指向的值不等于val nums[dst] = nums[src],src++,dst++
代码如下:
int removeElement(int* nums, int numsSize, int val)
{
int src = 0;
int dst = 0;
while (src <= numsSize-1)
{
if (nums[src] == val) src++;
else nums[dst++] = nums[src++];
}
return dst; //循环结束后dst就是数组的新长度了~
}
结果:
题目二
题目描述:
给你两个按 非递减顺序 排列的整数数组
nums1
和nums2
,另有两个整数m
和n
,分别表示nums1
和nums2
中的元素数目。请你 合并
nums2
到nums1
中,使合并后的数组同样按 非递减顺序 排列
注:nums1
的初始长度为m + n
这道题让我们将nums2数组合并到nums1中,且合并后数组为非递减排列
值得注意的是:nums1与nums2本来就是各自为非递减排列的,我们要利用好这点
所以这里就不用将nums2直接放在nums1再重新排序这种比较暴力的解法了
综上考虑后,Humble得出的思路是:
定义3个变量 l1,l2,l3 作为下标
l1指向nums1的有效数据的末尾,l2指向nums2的有效数据末尾
l3则指向nums1的的末尾
然后,从两个数组的最后一个有效数据开始从后往前比较,找大,谁大就从nums1
数组的最后一个位置开始从后往前放
代码如下:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int l1 = m-1;
int l2 = n-1;
int l3 = m+n-1;
while(l1>=0 && l2>=0) //循环的结束条件要么是l1<0,要么是l2<0
{
if(nums1[l1] > nums2[l2])
nums1[l3--] = nums1[l1--];
else
nums1[l3--] = nums2[l2--];
}
//特别注意:下面是一种特殊情况,要单独考虑
while (l2>=0) //如果循环结束后是l1<0,l2>=0, 则要将nums2中剩余的元素放到nums1中
nums1[l3--] = nums2[l2--];
}
运行结果如下:
结语
好了,今天关于顺序表的两道OJ题的分享就到这里了
在学习编程的道路上Humble与各位同行,加油吧各位!
最后希望大家点个免费的赞或者关注吧(感谢感谢),也欢迎大家订阅我的专栏
让我们在接下来的时间里一起成长,一起进步吧!