给你一个 升序排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
解法1:将数组中不同的元素拷贝到一个新数组中,之后再拷贝回去。时间复杂度O(N),空间复杂度O(N)
int removeDuplicates(int* nums, int numsSize){
// 采用复制数组的方法
int count=1;
int*arr=(int*)malloc(numsSize*4);
arr[0]=nums[0];
int i=0;
while(i<numsSize)
{
if(arr[count-1]==nums[i])
{
i++;
}
else
{
arr[count]=nums[i];
i++;
count++;
}
}
memcpy(nums,arr,4*count);
return count;
}
解法2:
在数组中原地复制的方法,一个src指针向后走,如果不是相同元素,则复制到dest的位置,dest也向后走一个
int removeDuplicates(int* nums, int numsSize){
int dest=0;
int src=0;
int count=1;
for(src=0;src<numsSize;src++)
{
if(nums[src]!=nums[dest])
{
count++;
dest++;
nums[dest]=nums[src];
}
}
return count;
}
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
解法1:如果不是val,则把值赋值到新数组中,之后将新数组拷贝回去。
解法2:只要src不是指向val,就把它赋值给dest指针的值,且dest指针往后走,如果是dest指针不动,src指针往后走
int removeElement(int* nums, int numsSize, int val){
int src=0;
int dest=0;
for(src=0;src<numsSize;src++)
{
if(nums[src]!=val)
{
nums[dest]=nums[src];
dest++;
}
}
return dest;
}
给你两个按 非递减顺序 排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。
请你 合并 nums2
到 nums1
中,使合并后的数组同样按 非递减顺序 排列。
解法1:将nums2合并到num1之中,使用快排即可。
int cmp_int(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
memcpy(nums1+m,nums2,n*4);
qsort(nums1,m+n,4,cmp_int);
}
解法2:两个指针,一个指向num1最后一个元素,一个指向num2最后一个元素,比较这两个元素的值,取大的放到num1后面,同时这个指针向前走。
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int i=m+n;
int p1=m-1;
int p2=n-1;
while(p1>-1&&p2>-1)
{
if(nums1[p1]>=nums2[p2])
{
nums1[i-1]=nums1[p1];
p1--;
}
else
{
nums1[i-1]=nums2[p2];
p2--;
}
i--;
}
while(p2>-1)
{
nums1[p2]=nums2[p2];
p2--;
}
}