合并两个有序数组(88. 合并两个有序数组)
题目:
思路:
【1】这种如果简单点的就是可以利用JDK的API来快速完成
【2】其实并没有什么进阶不进阶的,了解过归并算法的,其实便可以参考,新开辟一个足够存储的空间,然后按照指针指向分别从两个数组中拿出数据塞入新开辟的空间,这种其实就满足了遍历完两个数组的长度,也就是符合时间复杂度O(M+N)
【3】那么基于归并算法的话,有根据题意,其实nums1其实是有足够的的空间的,而且后面那部分的数据【默认是nums2大小的数组空间】其实可以认为是null,那么归并的话其实可以从后往前,依然是两个下标,这样就可以节省掉【2】里面开辟的新空间
代码展示:
利用官方API:
public void merge(int[] nums1, int m, int[] nums2, int n) { System.arraycopy(nums2, 0, nums1, m, n); Arrays.sort(nums1); }
参考归并算法:
public void merge(int[] nums1, int m, int[] nums2, int n) { int temp[] = new int[m + n]; int index = 0; int i = 0; int j = 0; while (i < m && j < n) { if (nums1[i] <= nums2[j]) temp[index++] = nums1[i++]; else temp[index++] = nums2[j++]; } for (; i < m; ) { temp[index++] = nums1[i++]; } for (; j < n; ) { temp[index++] = nums2[j++]; } //再把数组temp中的值赋给nums1 for (int k = 0; k < m + n; k++) { nums1[k] = temp[k]; } }
基于题意对归并算法的优化:
public void merge(int[] nums1, int m, int[] nums2, int n) { int i = m - 1; int j = n - 1; int end = m + n - 1; while (j >= 0) { nums1[end--] = (i >= 0 && nums1[i] > nums2[j]) ? nums1[i--] : nums2[j--]; } }