网站开发时遇不到算法,七牛云招聘,做类似起点的网站,seo顾问阿亮力扣网 88. 合并两个有序数组
题目描述
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2#xff0c;另有两个整数 m 和 n #xff0c;分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中#xff0c;使合并后的数组同样按 非递减顺序 排列。
注意…力扣网 88. 合并两个有序数组
题目描述
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中使合并后的数组同样按 非递减顺序 排列。
注意最终合并后数组不应由函数返回而是存储在数组 nums1 中。为了应对这种情况nums1 的初始长度为 m n其中前 m 个元素表示应合并的元素后 n 个元素为 0 应忽略。nums2 的长度为 n 。
示例 1
输入nums1 [1,2,3,0,0,0], m 3, nums2 [2,5,6], n 3
输出[1,2,2,3,5,6]
解释需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] 其中斜体加粗标注的为 nums1 中的元素。示例 2
输入nums1 [1], m 1, nums2 [], n 0
输出[1]
解释需要合并 [1] 和 [] 。
合并结果是 [1] 。示例 3
输入nums1 [0], m 0, nums2 [1], n 1
输出[1]
解释需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意因为 m 0 所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。思路分析
方法1
时间复杂度 Omn
空间复制度 Omn
这是最基本的思路将两个数组从头遍历分别比较大小较小的值先放到一个新创建的数组里比较完后可能会存在剩余的情况再将剩余的值放入新数组题目要求返回数组1再将新数组的内容拷贝进数组1里即可
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){int s10;int s20;int num3[200]{0};//新数组int i0;while(s1ms2n)//任何一个数组遍历完结束循环{if(nums1[s1]nums2[s2])//较小值先放{num3[i]nums1[s1];}else if(nums1[s1]nums2[s2])//相等则一起放任意规则{num3[i]nums1[s1];num3[i]nums2[s2];}else{num3[i]nums2[s2];}}if(s1m)//s1遍历完的情况下s2还没有遍历完的情况下{while(s2n){num3[i]nums2[s2];}}if(s2n)//s2遍历完的情况下s1还没有遍历完{while(s1m){num3[i]nums1[s1];}}for(int j0;jnums1Size;j)//将新数组拷贝到数组1里{nums1[j]num3[j];}}
方法2
时间复杂度 Omn
空间复杂度 O1
思路从两个数组的末尾开始遍历数组1从最后一个数开始向前遍历较大值放到数组1的末尾如果遍历完数组2还有剩余的话直接放入。
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){int s1m-1;//数组1的末尾最后一个数字int s2n-1;//数组2的末尾int indexmn-1;//数组1的末尾while(s10s20){if(nums1[s1]nums2[s2]){nums1[index--]nums1[s1--];}else{nums1[index--]nums2[s2--];}}while(s20)//数组2还有剩余的情况{nums1[index--]nums2[s2--];}}