赤壁网站定制,商品网站,齐鲁人才网泰安招聘,天元建设集团有限公司商票逾期题目链接#xff1a;算法面试题汇总 - LeetBook - 力扣#xff08;LeetCode#xff09;全球极客挚爱的技术成长平台
题目描述#xff1a;给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2#xff0c;另有两个整数 m 和 n #xff0c;分别表示 nums1 和 nums2 中的元…题目链接算法面试题汇总 - LeetBook - 力扣LeetCode全球极客挚爱的技术成长平台
题目描述给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中使合并后的数组同样按 非递减顺序 排列。注意最终合并后数组不应由函数返回而是存储在数组 nums1 中。为了应对这种情况nums1 的初始长度为 m n其中前 m 个元素表示应合并的元素后 n 个元素为 0 应忽略。nums2 的长度为 n 。
题目样例 输入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 中的元素。 提示 nums1.length m n nums2.length n 0 m, n 200 1 m n 200 -109 nums1[i], nums2[j] 109 解法一直接合并后排序直接将数组nums2放进数组nums2的尾部然后直接对整个数组进行排序。
代码如下
class Solution {
public:void merge(vectorint nums1, int m, vectorint nums2, int n) {for(int i0;in;i)nums1[im]nums2[i];sort(nums1.begin(),nums1.end());}
}; 解法二双指针法。方法一没有利用数组 已经被排序的性质。为了利用这一性质我们可以使用双指针方法。这一方法将两个数组看作队列每次从两个数组头部取出比较小的数字放到结果中。我们为两个数组分别设置一个指针p1和p2来作为队列的头部指针。
代码如下
class Solution {
public:void merge(vectorint nums1, int m, vectorint nums2, int n) {int p10,p20;int two[mn];int r0;while(p1m||p2n){if(p1m)two[r]nums2[p2];else if(p2n)two[r]nums1[p1];else if(nums1[p1]nums2[p2])two[r]nums1[p1];elsetwo[r]nums2[p2];}for(int i0;imn;i)nums1[i]two[i];}
};