给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
我的代码:先将数组全部放在一起,之后进行排序,很暴力…
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
for(int i = 0; i < n; i++){
nums1[i+m] = nums2[i];
}
Arrays.sort(nums1);
}
}
排名比较高的代码,可以从后往前进行遍历啊,这样就避免了往后移动的时间复杂度,每次选择一个数字,最大的就直接放进去就ok了,因此这个程序是复杂度不会很高。
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m + n - 1;
m--;
n--;
while(m>=0&&n>=0){
if(nums1[m]>nums2[n]){
nums1[i] = nums1[m];
m--;
}else{
nums1[i] = nums2[n];
n--;
}
i--;
}
while(m>=0){
nums1[i] = nums1[m];
i--;
m--;
}
while(n>=0){
nums1[i] = nums2[n];
i--;
n--;
}
}
}
自己根据这个提示,实现一遍,发现效率更低了…
public static void merge(int[] nums1, int m, int[] nums2, int n) {
int length1 = n + m;
int length = n + m -1;
m--;
n--;
while (m >= 0 && n >=0) {
if (nums1[m] > nums2[n]) {
nums1[length] = nums1[m];
System.out.println(nums1[length]);
length--;
m--;
}else {
nums1[length] = nums2[n];
System.out.println(nums1[length]);
length--;
n--;
}
}
if(m == -1){
int j = n;
System.out.println("j "+ j);
for(int i = 0; i < n+1; i++){
nums1[length] = nums2[j--];
length--;
//n--;
}
}else {
int j = m;
for(int i = 0; i < m +1; i++){
nums1[length] = nums1[j--];
length--;
// m--;
}
}
}