网站编程语言,郑州一凡网站建设,个人网站如何进行网络推广,linux wordpress 伪静态系列博客目录 文章目录 系列博客目录88. 合并两个有序数组 简单示例 1:示例 2:示例 3:提示:问题: 88. 合并两个有序数组 简单
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2#xff0c;另有两个整数 m 和 n#xff0c;分别表示 nums1 和 nums2 中的元素数目。
请你…系列博客目录 文章目录 系列博客目录88. 合并两个有序数组 简单示例 1:示例 2:示例 3:提示:问题: 88. 合并两个有序数组 简单
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2另有两个整数 m 和 n分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中使合并后的数组同样按 非递减顺序 排列。
注意最终合并后数组不应由函数返回而是存储在数组 nums1 中。 为了应对这种情况nums1 的初始长度为 m n其中前 m 个元素表示应合并的元素后 n 个元素为 0默认忽略。 示例 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]
解释: 由于 m 0所以 nums1 中没有元素。 需要合并的数组仅为 nums2 。 结果是 [1]nums1 中的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。 提示:
nums1.length m nnums2.length n0 m, n 2001 m n 200-10^9 nums1[i], nums2[j] 10^9 问题:
你可以设计一个时间复杂度为 O(m n) 的算法解决此问题吗 我的思路是先判断特殊情况然后先把nums1中的小于nums2[0]的放入最后结果数组result中再用双指针。
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int[] result new int[nums1.length1];Arrays.fill(result, 0);int index 0;int index_nums2 0;int index_nums1 0;if(n 0){return;}if(m0){for (int i 0; i nums2.length; i) {nums1[i]nums2[i];}return;}//下面这个while循环之后发现没必要while(nums1[index_nums1]nums2[index_nums2]){result[index]nums1[index_nums1];if(index_nums1m){for(int l index_nums2;lnums2.length;l){result[index]nums2[index_nums2];}for (int i 0; i nums1.length; i) {nums1[i]result[i];}return;}index_nums1;index;}while(index_nums1m||index_nums2n){while(nums1[index_nums1]nums2[index_nums2]){result[index]nums1[index_nums1];if(index_nums1m){for(int l index_nums2;ln;l){result[index]nums2[index_nums2];}for (int i 0; i nums1.length; i) {nums1[i]result[i];}return;}}while(nums2[index_nums2]nums1[index_nums1]){result[index]nums2[index_nums2];if(index_nums2n){for(int l index_nums1;lm;l){result[index]nums1[index_nums1];}for (int i 0; i nums1.length; i) {nums1[i]result[i];}return;}}}}
}后来发现其中一段代码没有必要也就是不用先把nums1中的小于nums2[0]的放入最后结果数组result中再用双指针可以直接使用双指针。
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int[] result new int[nums1.length1];Arrays.fill(result, 0);int index 0;int index_nums2 0;int index_nums1 0;if(n 0){return;}if(m0){for (int i 0; i nums2.length; i) {nums1[i]nums2[i];}return;}while(index_nums1m||index_nums2n){while(nums1[index_nums1]nums2[index_nums2]){result[index]nums1[index_nums1];if(index_nums1m){//判断特殊即nums1数组已经处理完毕只省下nums2数组for(int l index_nums2;ln;l){result[index]nums2[index_nums2];}for (int i 0; i nums1.length; i) {//整理结果nums1[i]result[i];}return;}}while(nums2[index_nums2]nums1[index_nums1]){result[index]nums2[index_nums2];if(index_nums2n){for(int l index_nums1;lm;l){result[index]nums1[index_nums1];}for (int i 0; i nums1.length; i) {//整理结果nums1[i]result[i];}return;}}}}
}官网的双指针自己的麻烦地方在于没有想到用一个while循环即可实现自己想的是判断完了该取哪个数组的值后在数组中用while连续取值但是应该是一个while在这个while里面觉得从哪个数组取值自己的思路和官方的思路顺序相反。
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 0, p2 0;int[] sorted new int[m n];int cur;while (p1 m || p2 n) {if (p1 m) {cur nums2[p2];} else if (p2 n) {cur nums1[p1];} else if (nums1[p1] nums2[p2]) {cur nums1[p1];} else {cur nums2[p2];}sorted[p1 p2 - 1] cur;}for (int i 0; i ! m n; i) {nums1[i] sorted[i];}}
}作者力扣官方题解
链接https://leetcode.cn/problems/merge-sorted-array/solutions/666608/he-bing-liang-ge-you-xu-shu-zu-by-leetco-rrb0/
来源力扣LeetCode
著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。复杂度分析 时间复杂度: (O(m n))。 指针移动单调递增最多移动 (m n) 次因此时间复杂度为 (O(m n))。 空间复杂度: (O(m n))。 需要建立长度为 (m n) 的中间数组 sorted。