今日份leetcode 88. Merge Sorted Array
Description:
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
The number of elements initialized in nums1 and nums2 are m and n respectively.
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.
Example:
Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
Output: [1,2,2,3,5,6]
看到这个题我的想法是,创建一个长度为m+n的数组nums3,然后从前往后依次比较两个数组的元素大小,把小的元素依次放入新数组。
方法一
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] nums3 = new int[nums1.length]; //存放排好序的数组
int i ,k, j; //i充当数组nums1的指针
j=k=0;
for(i=0;i<m&&j<n;i++){
if(nums1[i]<=nums2[j])
nums3[k++]=nums1[i];
else{
nums3[k++]=nums2[j++];
i--;
}
}
if(i<m){
for(;i<m;i++)
nums3[k++]=nums1[i];
}
if(j<n){
for(;j<n;j++)
nums3[k++]=nums2[j];
}
for(int i1=0;i1<nums1.length;i1++){ //这里在将数组nums3赋给nums1时需要注意
nums1[i1]=nums3[i1];
}
}
}
虽然时间复杂度不是很高,但在代码逻辑上有些复杂。另外在参数传递的方面产生了一点问题,一会在后面记录一下,现在先解题。
方法二
class Solution {
public void merge(int A[], int m, int B[], int n) {
int i=m-1; //记录nums1从后往前的索引
int j=n-1; //记录nums2从后往前的索引
int k = m+n-1; //记录合并后的数组从后往前的索引
while(i >=0 && j>=0)
{
if(A[i] > B[j])
A[k--] = A[i--];
else
A[k--] = B[j--];
}
while(j>=0)
A[k--] = B[j--];
}
}
此方法的思路与我又是恰好相反的,它是从后往前排序,即先找数大的,然后把它放在后面。这样还能有机会省去某个数组最前面一些数的排序。
方法三
class Solution {
public static void merge(int[] nums1, int m, int[] nums2, int n) {
if (nums2.length==0 || n==0);
for (int i=m,j=0;j<n;i++,j++) nums1[i]=nums2[j];
Arrays.sort(nums1);
}
}
这也是一个很简单的方法,但大多数sort方法的时间复杂度是 O(n*log(n)),所以单看时间复杂度此方法不如前两个方法。
关于方法一中提到的Java中方法参数的问题我单独写了一个笔记来整理记录:
https://blog.youkuaiyun.com/weixin_39979073/article/details/84642318