一、移除元素
原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。
思路:
定义两个变量指向数组的第一个位置,判断nums[src]是否等于val
(1) 相等,src++
(2) 不相等,nums[dst]=nums[src], src++, dst++
最终,dst指向的位置就是要返回的有效个数。
代码如下:
int removeElement(int* nums, int numsSize, int val)
{
int dst=0;
int src=0;
while(src<numsSize)
{
if(nums[src]==val)
src++;
else
nums[dst++]=nums[src++];
}
return dst;
}
二、删除排序数组中的重复项
思路:
定义两个变量dst、src , dsr指向第一个位置,src指向下一个位置,判断src和dst位置的数据
(1)相等,src++
(2)不相等,dst++,赋值 nums[dst]=nums[src] , src++
最终dst+1的值就是返回的有效值。
代码如下:
int removeDuplicates(int* nums, int numsSize)
{
int dst=0;
int src=dst+1;
while(src<numsSize)
{
if(nums[dst]!=nums[src]&&++dst!=src)//避免一些没有必要的赋值,提高程序效率
nums[dst]=nums[src];
src++;
}
return dst+1;
}
三、 合并两个有序数组
思路:
1.创建三个变量l1、l2、l3 , 分别指向nums1最后一个有效数据的位置,nums2最后一个数据位置,nums1最后一个位置。
2.比较l1和l2位置的数据,哪个大,就把它放在l3的位置上。
结束条件:要么l1<0 要么l2<0
l1<0:要处理nums2中的数据,循环放到nums1中。
l2<0:不需要处理,因为nums2中的数据已经有序的放到了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)
{
if(nums1[l1]>nums2[l2])
{
nums1[l3--]=nums1[l1--];
}
else
{
nums1[l3--]=nums2[l2--];
}
}
if(l1<0)
while(l2>=0)
{ nums1[l3--]=nums2[l2--];}
}