题目链接:88. 合并两个有序数组
思路:(双指针)
题目要求将最后的结果放在nums1数组里,不多借用一个数组nums3的方法是实在想不到。创建两个计数器(指针)分别代表两个数组的下标,目的是为了分别记录移动并时效判断当前数组所处位置。
然后使用循环,将两个数组依次做比较,判断此次循环应该将哪个数组的值按序存入临时数组num3中(选择小的),故根据条件语句if判断选出小的值(保证顺序)存入,并将该数组的和临时数组num3的计数器+1。
设置循环结束的条件是,其中有一个数组存完,则判断是哪个数组存完了,将另一个数组的值直接存入临时数组num3中。最后根据题目要求,将临时数组num3的值存入nums1中。
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] nums3 = new int[m + n];
int i = 0,j = 0,k = 0;
for(; i < m && j < n; k++){//遍历两个数组
if(nums1[i] < nums2[j]){
nums3[k] = nums1[i];
i++;
}else{
nums3[k] = nums2[j];
j++;
}
}
if(i == m){//判断是哪个数组"多"出来了,并将其接在后面
for(int t = k; t < m + n; t++)
nums3[t] = nums2[j++];
}else if(j == n){
for(int t = k; t < m + n; t++)
nums3[t] = nums1[i++];
}
for(int t = 0; t < m + n; t++){//根据要求搞在第一个数组上
nums1[t] = nums3[t];
}
}
}
时间复杂度:O(m + n)
空间复杂度:O(m + n)
直接合并后排序
还是这个简单,都放入nums1中,然后排序
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
for(int i = m,j = 0; i < m + n; i++,j++){
nums1[i] = nums2[j];
}
Arrays.sort(nums1);
}
}
//实质:快速排序的时间复杂度和空间复杂度,长度为:m + n
时间复杂度:O((m + n)log(m + n))
空间复杂度:O(log(m + n))
逆向双指针
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1 = m - 1, p2 = n - 1;
int tail = m + n - 1;
int cur;
while (p1 >= 0 || p2 >= 0) {
if (p1 == -1) {
cur = nums2[p2--];
} else if (p2 == -1) {
cur = nums1[p1--];
} else if (nums1[p1] > nums2[p2]) {
cur = nums1[p1--];
} else {
cur = nums2[p2--];
}
nums1[tail--] = cur;
}
}
}
官方解答链接:排序、双指针、逆序双指针