引言
力扣题目【合并两个有序数组】描述 -> 传送门
所用语言:Java
第一种答案:执行用时 1 ms,内存消耗 38.4 MB
第二种答案:执行用时 0 ms,内存消耗 38.6 MB
正文
今天的题目是简单题,也确实是简单,这里就不详细讲了,可以直接看代码
答案①
主要的思路:在 num1 数组上进行数据的移动,如果 num2 有符合的数据要插入进来,就将数据往后移,空出一个位置来接收数据。所以较为节省空间
public void merge(int[] nums1, int m, int[] nums2, int n) {
int tail = m;
int ptrTwo = 0;
for (int i = 0; i < tail && ptrTwo < n; ) {
if (nums2[ptrTwo] < nums1[i]) {
for (int temp = tail; temp > i; temp--) {
nums1[temp] = nums1[temp - 1];
}
tail += 1;
nums1[i] = nums2[ptrTwo];
ptrTwo++;
i++;
} else {
i++;
}
}
if (ptrTwo < n) {
do {
nums1[tail++] = nums2[ptrTwo++];
} while (ptrTwo < n);
}
}
答案②
主要的思路:重新定义一个数组 tempArray 并复制 num1 的数据,然后 tempArray 数组和 num2 数组中的数据逐个比较,逐个放入 num1 数组中。所以较为节省时间
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] tempArray = new int[m];
for (int i = 0; i < m; i++) {
tempArray[i] = nums1[i];
}
int ptrOne = 0;
int ptrTwo = 0;
int index = 0;
while (ptrOne < m && ptrTwo < n) {
if (tempArray[ptrOne] <= nums2[ptrTwo]) {
nums1[index++] = tempArray[ptrOne++];
} else {
nums1[index++] = nums2[ptrTwo++];
}
}
if (ptrOne < m) {
do {
nums1[index++] = tempArray[ptrOne++];
} while (ptrOne < m);
} else if (ptrTwo < n) {
do {
nums1[index++] = nums2[ptrTwo++];
} while (ptrTwo < n);
}
}
最后
当然,肯定还会有很好的办法的。比如因为给出的两个数组都是有序的,所以在采用答案①的思路的时候,可以做一下修改,进行一次批量插入多个数据。这样就可以减少移动 num1 数组中的数据的次数,时间上会更快 😊