|
| 1 | +# No.88 合并两个有序数组 |
| 2 | + |
| 3 | +难度:`easy` |
| 4 | + |
| 5 | +给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 |
| 6 | + |
| 7 | + |
| 8 | +说明: |
| 9 | + |
| 10 | +初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 |
| 11 | +你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 |
| 12 | + |
| 13 | +## 示例 |
| 14 | + |
| 15 | +示例: |
| 16 | + |
| 17 | +``` |
| 18 | + |
| 19 | +输入: |
| 20 | +nums1 = [1,2,3,0,0,0], m = 3 |
| 21 | +nums2 = [2,5,6], n = 3 |
| 22 | + |
| 23 | +输出: [1,2,2,3,5,6] |
| 24 | + |
| 25 | +``` |
| 26 | + |
| 27 | +## 解题思路 |
| 28 | + |
| 29 | +第一种很简单粗暴,直接合并两个数字,再进行排序。 |
| 30 | + |
| 31 | +但是这样没有利用到数组原本就有序的特点。 |
| 32 | + |
| 33 | +这里使用插入排序的思想,将num2的数组依次插入到num1中。 |
| 34 | + |
| 35 | +代码如下: |
| 36 | + |
| 37 | +```javascript |
| 38 | +/** |
| 39 | + * @param {number[]} nums1 |
| 40 | + * @param {number} m |
| 41 | + * @param {number[]} nums2 |
| 42 | + * @param {number} n |
| 43 | + * @return {void} Do not return anything, modify nums1 in-place instead. |
| 44 | + */ |
| 45 | +var merge = function(nums1, m, nums2, n) { |
| 46 | + let j = 0; |
| 47 | + let valid = m; |
| 48 | + while (j < n) { |
| 49 | + let isInsert = false; |
| 50 | + let element = nums2[j]; |
| 51 | + for (let i = 0; i < valid; i++) { |
| 52 | + // 插入排序 |
| 53 | + if (nums1[i] > element) { |
| 54 | + // 整个数组向后移动 |
| 55 | + for (let a = valid; a > i; a--) { |
| 56 | + nums1[a] = nums1[a-1]; |
| 57 | + } |
| 58 | + nums1[i] = element; |
| 59 | + isInsert = true; |
| 60 | + break; |
| 61 | + } |
| 62 | + } |
| 63 | + if (!isInsert) { |
| 64 | + nums1[valid] = element; |
| 65 | + } |
| 66 | + valid++; |
| 67 | + j++; |
| 68 | + } |
| 69 | +}; |
| 70 | + |
| 71 | +// merge([1,2,3,0,0,0],3,[2,5,6],3); |
| 72 | + |
| 73 | +``` |
0 commit comments