目录
1移除元素![](https://i-blog.csdnimg.cn/blog_migrate/76224a749b0a302010866316122c0c38.png)
1.1传统解法
依次挪动数据覆盖查找到每一个val
空间复杂度O(1)
时间复杂度O(N^2)
最坏情况:全是val
1.2思路2
把不是val的值拷贝到新数组
时间复杂度O(N)
空间复杂度O(N)
1.3思路3(双指针)
新的长度就是dst
int removeElement(int* nums, int numsSize, int val){
int src = 0,dst=0;
while(src<numsSize)
{
if(nums[src]!=val)
{
nums[dst] = nums[src];
src++;
dst++;
}
else
{
src++;
}
}
return dst;
}
2.删除有序数组中的重复项
2.1双指针
src和它的前一个位置比较,如果相等则后移,如果不相等,将前一个值放入dst中
if(nums[src - 1] == nums[src])
{
scr++;
}
else
{
nums[dst] = nums[src - 1];
scr++;
dst++;
}
本质src跟src-1位置值,不相等时,前一段重复值区间已经走完了,那么把最后一个保留到dst的位置
int removeDuplicates(int* nums, int numsSize){
int src = 1,dst = 0;
while(src<numsSize)
{
if(nums[src]==nums[src-1])
{
src++;
}
else
{
nums[dst] = nums[src-1];
src++;
dst++;
}
}
nums[dst] = nums[numsSize-1];
dst++;
return dst;
}
2.2方法二(时间复杂度O(N))
int removeDuplicates(int* nums, int numsSize)
{
if (numsSize == 0)
return 0;
int dst = 0;
int cur = 0, next = 1;
while (next < numsSize)
{
if (nums[cur] != nums[next])
{
nums[dst++] = nums[cur++];
++next;
}
else
{
while (next < numsSize && nums[cur] == nums[next])
{
++next;
}
nums[dst] = nums[cur];
++dst;
cur = next;
++next;
}
}
if (cur < numsSize)
nums[dst++] = nums[cur];
return dst;
}
3.合并两个非递减数组(要求:时间复杂度O(N))
3.1归并的思路
依次比较,每次把小的放到归并数组
if (nums[i] < nums[j])
a[dst++] = num[i++];
else
a[dst++] = nums[j++];
3.2不开额外的数组
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int i = m-1,j = n-1;
int dst = m+n-1;
while(i>=0&&j>=0)
{
if(nums1[i] > nums2[j])
{
nums1[dst] = nums1[i];
dst--;
i--;
//nums1[dst--] = nums1[i--];
}
else
{
nums1[dst--] = nums2[j--];
}
}
while(j>=0)
{
nums1[dst--] = nums1[j--];
}
}