1、题目介绍
2、思路分析
一、第一种解法:直接合并,在进行排序
使用for循环直接将nums2数组复制到nums1后面,然后进行排序
代码:
//第一种方法:直接合并后排序
for (int i = 0; i < n; i++) {
nums1[i + m] = nums2[i];
}
//排序
Arrays.sort(nums1);
二、第二种解法:采用双指针法【类似于分治方法中的治】
通过对比俩个数组中元素的值,将小的元素增加到 临时数组 temp 中,最终nums1和nums2哪个数组中有剩余元素直接增加到temp中。最后将temp拷贝到nums1中
代码:
//第二种方法:使用双指针,逐个比较俩个数组中的元素,把最小的放入temp数组中【类似于归并排序的合并步骤】
int i = 0; //指向nums1
int j = 0;//指向nums2
int[] temp = new int[m + n];
int index = 0;
//对俩个数组进行遍历。进行比较,
while (i < m && j < n) {
if (nums1[i] > nums2[j]) {
temp[index++] = nums2[j++];
} else {
temp[index++] = nums1[i++];
}
}
//如果nums1还有剩余元素直接加到temp中
while (i < m) {
temp[index++] = nums1[i++];
}
//如果nums2还有剩余元素直接加到temp中
while (j < n) {
temp[index++] = nums2[j++];
}
//将temp数组拷贝到nums1
System.arraycopy(temp,0,nums1,0,temp.length);
其中这里的代码一行就可以搞定:
while (i < m && j < n) {
if (nums1[i] > nums2[j]) {
temp[index++] = nums2[j++];
} else {
temp[index++] = nums1[i++];
}
}替换成:
while(i < m && j < n){ temp[index++] = nums1[i] > nums2[j] ? nums2[j++] : nums1[i++]; }
对数组进行拷贝的几种方法:
1、for循环拷贝
2、Arrays.copyOf(dataType[] srcArray , int length);
dataType[] srcArray:想要复制的数组 length : 复制的长度
3、Arrays.copyOfRange(dataType[] srcArray,int startIndex,int endIndex)
int startIndex : 目标数组的起始索引,长度必须小于srcArray.length
int endIndex : 目标数组的结束索引 ,长度可大于srcArray.length,空出来的部分默认填充
4、System.arraycopy(dataType[] srcArray,int srcIndex,int destArray,int destIndex,int length)
int srcIndex : 原数组起始索引
int destArray:目标数组
int destIndex:目标数组起始索引
length : 复制的长度