例一:除重算法。
给你一个 升序排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
思路:使用两个指针begin和end(从第二个元素开始),begin依次遍历数组中的每个元素。如果begin所指向的元素与前一个元素不同,则意味着这个数是第一次出现,将其放在end所指向的位置中,然后end向后挪一位,否则这个数就是重复数,end不变,begin++。
int removeDuplicates(int* nums, int numsSize)
{
int* str = nums+1;
int* dst = nums+1;
int count = 1;
for (str; str < nums+numsSize; str++)
{
if(*str!=*(str-1))
{
*dst=*str;
dst++;
count++;
}
}
return count;
}
例二:合并两个有序数组。
给你两个按非递减排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。
请你合并nums2
到 nums1
中,使合并后的数组同样按非递减顺序排列。
思路:最容易想到的方法:用两个指针控制遍历两个数组。比较指向的元素,把较小的那个放到前面,然后对应的指针加一。
但是因为需要把合并后的数放到nums1中,如果不使用中间临时存储数组,就不能使用双指针从头开始比较。因此我们可以从后往前遍历,先把最大值放到最后一个位置,依次向前遍历比较。
如果nums1先遍历完成,nums2还会有一部分元素没有被合并,因此我们还需要再合并一次,直接把nums2中剩余的元素放到nums1数组的最前面。
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int* p1=nums1+m-1;
int* p2=nums2+n-1;
int* p3=nums1+nums1Size-1;
while(p1>=nums1&&p2>=nums2)
{
if(*p1>*p2)
{
*p3=*p1;
p1--;
p3--;
}
else
{
*p3=*p2;
p2--;
p3--;
}
}
//用memcpy拷贝
if(p2>=nums2)
{
memcpy(nums1,nums2,(p2-nums2+1)*4);
}
//利用while循环
/* while(p2>=nums2)
{
*p3=*p2;
p2--;
p3--;
}*/
}