题目如下:
给出的输出示例如下:
分析思路:
第一种解法就是直接先将nums2数组插入到num1数组的末尾中,然后将新得到的nums1数组进行循环遍历进行排序。
参考代码如下:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
for(int i=0;i<n;i++){
nums1[m+i]=nums2[i]; //将nums2插入到nums1的末尾中
}
int temp=0;
for(int i=0;i<(m+n);i++){
for(int j=i+1;j<(m+n);j++){ //循环遍历排序
if(nums1[i]>nums1[j]){
temp=nums1[i];
nums1[i]=nums1[j];
nums1[j]=temp;
}
}
}
}
}
第二种解法是反向双指针的思想,nums1的空间都基本集中在后面,所以从后向前进行数据处理排序会更好,节省空间的同时一边遍历一把就把数值填充了进去。
设置left指针和right指针分别指向nums1数组和nums2数组的末尾,然后再设置len指向新nums1数组的末尾,反向开始遍历nums1和nums2两个数组,并且比较大小将较大的值传入新的nums1数组,当left<0遍历完时,nums2数组有可能还有数据没有填空进去,此时很显然都是比nums1数组里面的数小同时又是非递减的数,所以直接将其拷贝到新nums1数组最前面即可,最后得到要求的新数组nums1。
参考代码如下:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int left=m-1;
int right=n-1;
int len=m+n-1;
while(left>=0&&right>=0){ //这边利用三目运算符一步到位
nums1[len--]=nums1[left]>nums2[right] ? nums1[left--] : nums2[right--];
}
System.arraycopy(nums2,0,nums1,0,right+1); //将剩余的nums2里面的数据拷贝到新的nums1数组
} //nums2 要被复制的数组
} //0 要被复制的数组数字的下标
//nums1 目标数组
//0 从目标数组第几个下标开始放入数据
//right+1 要拷贝的长度
下面分别是两种方法的运行数据:
可以看出虽然第一种算法理解起来比第二种算法要简单,但是第二种算法效率上明显要优于第一种算法,所以在能理解的情况下,我们可以尽量选择第二种算法。