解题思路
数组里面的元素都是大于0的,那么我们的思路就是,遍历整个数组。查找到为删除的值和元素的相等时,后面的不为相等的进行覆盖。 时间复杂度O(n),空间复杂度O(1)
代码
int removeElement(int* nums, int numsSize, int val){
int i=0,j=0;
for(i=0;i<numsSize;i++)
{
if(nums[i]==val)
{
continue;
}
nums[j++]=nums[i];
}
return j;
}
解题思路
思路1:
再次开辟一个空间为m+n的数组,将nums1 数组的里面的元素分别与nums2 里面的元素比较,直达其中一个数组里面的元素全部拷贝到新开辟的数组中,然后把另一个数组剩下的元素拷贝到新的数组中。最后把新开辟数组拷贝到nums1 中。 时间复杂度O(m+n),空间复杂度O(m+n)
思路2:
比较两个数组最大的元素,也就是从后往前遍历,较大的插入到nums1 后面,直到其中一个数组遍历完成。 时间复杂度O(m+n),空间复杂度O(1)
代码
思路1代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int* num=(int*)malloc(nums1Size*sizeof(int));
if(num==NULL)
return;
int i=0,j=0,x=0;
for(i=0;i<m;i++)
{
for(;j<n;j++)
{
if(nums1[i]>nums2[j])
{
num[x++]=nums2[j];
}
else
{
num[x++]=nums1[i];
break;
}
}
if(j==n)
num[x++]=nums1[i];
}
if(i==m)
while(j<n)
{
num[x++]=nums2[j++];
}
for(i=0;i<nums1Size;i++)
{
nums1[i]=num[i];
}
free(num);
num=NULL;
}
思路2代码 注意边界
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int a,b,c;
a=m-1;
b=n-1;
c=nums1Size-1;
while(a!=-1&&b!=-1)
{
if(nums1[a]>nums2[b])
{
nums1[c--]=nums1[a--];
}
else
{
nums1[c--]=nums2[b--];
}
}
if(a==-1)
while(b!=-1)
{
nums1[c--]=nums2[b--];
}
}
|