1. 原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。27. 移除元素 - 力扣(LeetCode)
假想有一个新数组,但实际还是用的数组本身,没有额外开辟空间。old在遍历,自动往后走,发现不是val,就把老数组赋值给新数组,就能得到新的长度。
int removeElement(int* nums, int numsSize, int val)
{
int new = 0;
int old = 0;
for(old = 0; old<numsSize;old++)
{
if(nums[old] != val)
{
nums[new++] = nums[old];
}
}
return new;
}
2. 删除排序数组中的重复项。26. 删除有序数组中的重复项 - 力扣(LeetCode)
如果报错可以简单的用vs验证下。快慢指针的经典题目,想要不开辟新空间,往往可以先考虑快慢指针。
int removeDuplicates(int* nums, int numsSize)
{
if(numsSize == 0)
{
return 0;
}
else if(numsSize == 1)
{
return 1;
}
else
{
int fast = 0;
int slow = 1;
for(fast = 1;fast<numsSize;fast++)
{
if(nums[fast] != nums[fast-1])
{
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}
3. 合并两个有序数组。88. 合并两个有序数组 - 力扣(LeetCode)
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
while(m>0&&n>0)
{
if(nums1[m-1]>=nums2[n-1])
{
nums1[m+n-1]=nums1[m-1];
m--;
}
else
{
nums1[m+n-1]=nums2[n-1];
n--;
}
}
if(n==0)//不需要合并了
{
return;
}
if(m==0)//直接把nums2给nums1就可以了
{
for(int i=0;i<n;i++)
{
nums1[i]=nums2[i];
}
}
}