一、移除元素
1、题目描述
2、算法分析
思路1:查找val值对应的下标pos,执行删除pos位置数据的操作。
该方法时间复杂度为O(n^2),因此不建议使用。
思路2:创建新数组(空间大小与原数组一致),遍历原数组,将非val值放到tmp数组中,再将tmp数组拷贝回原数组。
该方法时间复杂度O(N),空间复杂度O(N)。体现了用空间换时间的思想。
思路3:双指针法
创建两个变量dst 和 src,(1)nums[src] == val,src++
(2)nums[src] != val,赋值(src给dst),dst++,src++
3、参考代码
int removeElement(int* nums, int numsSize, int val)
{
//定义两个变量
int dst = 0, src = 0;
while(src < numsSize)
{
//src值和val比较
if(nums[src] != val)
{
nums[dst] = nums[src];
dst++;
}
src++;
}
return dst;
}
二、删除有序数组中的重复项
1、题目描述
2、算法分析
思路:双指针法
创建两个变量,分别指向起始位置和下一个位置。
(1)nums[src] == nums[dst],src++
(2)nums[src] != nums[dst],dst++,赋值(src给dst),src++
3、参考代码
int removeDuplicates(int* nums, int numsSize)
{
int dst = 0, src = dst + 1;
while(src < numsSize)
{
if(nums[src] != nums[dst])
{
dst++;
nums[dst] = nums[src];
}
src++;
}
return dst + 1;
}
三、合并两个有序数组
1、题目描述
2、算法分析
思路1:先合并,再排序
冒泡排序:O(N^2) qsort:O(NlogN)
思路2:空间换时间
创建新数组tmp,空间大小和nums1一致,遍历两个原数组的数据并比较大小,放到tmp中。
思路3:从后往前比较大小,找大的
注意:不能从前往后比较大小找小的,因为小的往前放会导致数据被覆盖!
3、参考代码
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)
{
//比较大小,找大
if(nums1[l1] < nums2[l2])
{
nums1[l3] = nums2[l2];
l2--;
l3--;
}
else
{
nums1[l3] = nums1[l1];
l1--;
l3--;
}
}
//要么l1先越界,要么l2先越界
while(l2 >= 0)
{
nums1[l3] = nums2[l2];
l3--;
l2--;
}
}