目录
1.移除元素
解题思路
代码
2.合并两个有序数组
解题思路
代码
1.移除元素
解题思路
原地删除数组num的val元素,那么我们需要做的是遍历num数组
再次过程中越过num数组val的元素,找num数组中不是val的原素,并把它们从头依次放入num数组,num数组中非val元素的个数要记录起来并返回。
体会一下:
有一个数组 :[ 2 , 1 , 3 , 2 , 4 , 5] 删除val = 2的元素
其中红色箭头为:遍历整个数组,并且跳过val元素
蓝色箭头为:数组中的有效元素,并且将red遍历过不是val的元素存起来
当我们遍历完的时候,蓝色的箭头指向下标多了一步,这是为了弥补我们数组下标从0开始的差值
代码
int removeElement(int* nums, int numsSize, int val) {//定义两个下标,red遍历数组,并且跳过val元素//bule为有效的元素个数,并且将red遍历过不是val的元素存起来int red = 0;int blue = 0;//当走出数组,循环结束 while(red < numsSize){//red遍历数组,跳过val元素if(nums[red] == val){src++;}//把非val元素依次的存入blue处,red,bule继续往后走else{nums[dst] = nums[src];src++;dst++;}}//返回bule个有效元素return bule;
}
2.合并两个有序数组
解题思路
定义三个下标分别指向:
l1 = nums1有效元素末尾,l2 = nums2有效元素末尾, l3 = nums1数组末尾
为什么要这样做?
我们需要做到的是:排序两个有序的数组,l1 和 l2 就是用来比较nums1 与nums2哪个元素大哪个元素大就把哪个元素放进新的数组。而 数组nums1 的大小干好是nums1中有效元素 + nums2中有效元素,所以我们拿它来当成是新的数组,当然你再新创建一个数组也可以。
依次的比较直到nums2数组的元素移动完毕。
代码
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){哪个元素大就将它放至l3位置,如果元素相等的话,无所谓放谁先if(nums1[l1] < nums2[l2]){nums1[l3--] = nums2[l2--];}else{nums1[l3--] = nums1[l1--];}}//如果数组nums2的元素还未移动完全,那么依次将它放入nums1数组即可while(l2 >= 0){nums1[l3--] = nums2[l2--];}}