✨✨小新课堂开课了,欢迎欢迎~✨✨
🎈🎈养成好习惯,先赞后看哦~🎈🎈
所属专栏:http://t.csdnimg.cn/XSLtz(经典算法题)
小新的主页:编程版小新-CSDN博客
前言:前面我们已经系统的学习了顺序表的内容,理论知识我们已经知道了,现在就来实战一下吧。
以下题目截屏均来自于力扣网站。
1.移除数组
思路一:用开辟一个新的数组,遍历原数组,将不是val的值放在新数组中。
题目要求我们对所给数组进行原地修改,不能额外开辟空间。因此这个思路是行不通的。
思路二:创建两个指针变量,比如src,dst。我们根据示例中的提示信息,利用这两个变量,将不是val的值移到数组的前面。这一操作完成后,你会惊奇的发现dst返回的刚好就是数组新的长度。
具体思路:src和dst在其实位置就是数组的起始位置,如果src对应的值是val,src++;如果src对应的值不是val,将src对应的值赋值给dst对应的值 ,然后src++,dst++,最后dst返回的下标就是数组的新长度。
代码实现:
//双指针法
int removeElement(int* nums, int numsSize, int val) {
int src = 0;
int dst = 0;
while (src < numsSize)
{
if (nums[src] == val)
{
src++;
}
else
{
nums[dst] = nums[src];
src++;
dst++;
}
}
return dst;
}
2.合并两个有效数组
思路一:我们可以先将nums2中的元素放进nums1中,然后利用一些排序方法去将nums1中的元素重新排序。
这个思路可以解决问题,但是如果要排序的话就会使得效率低下。
下面有一个更好的思路。
思路二:我们从后往前比大小,谁大谁就放在nums1的后面。
代码实现:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int len1 = m-1;
int len2 = n-1;
int len3 = m+n-1;
//比较元素大小,谁大谁放在后面
while(len1>=0 && len2>=0)
{
if(nums1[len1]<nums2[len2])
{
nums1[len3--]=nums2[len2--];
}
else
{
nums1[len3--]=nums1[len1--];
}
}
//出了循环就说明len1<0或者len2<0
//当然也有两个刚好都为0的情况
//我们只考虑len1<0,也就是len2>=0的情况(说明nums2中的元素还没完全放进nums1中)
while(len2>=0)
{
nums1[len3--]=nums2[len2--];
}
}