题目描述:
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.
大白话:
合并两个有序的数组
原题目链接:88. Merge Sorted Array
思路:
以数组[1,4,5]和[1,2,8,9]为例子;
我们知道合并后的数组总的有效数目为m+n,因为都是从0开始,所以nums1和nums2的最后一个元素的索引分别是m-1和n-1,合并后的nums1的最后一个元素的索引应该是m+n-1。
我们在数组nums1中设p从尾部开始索引[即从确定大数开始],在m和n的数组中i和j也是从尾部大数开始索引,nums1[i]和nums2[j]比较下谁大谁就去填补p指引的那个位置,谁去填补了i或者j就往左边移动。
AC代码如下:
var merge = function(nums1, m, nums2, n) {
if(m ==0&&n==0) return;
if(m==0&&n!=0){
for(var i = 0;i<n;i++){
nums1[i]=nums2[i];
}
}
if(m!=0&&n!=0){
var i = m-1, j = n-1, p = m+n-1;
while(j>=0&&i>=0){
if(nums1[i]>nums2[j]){
nums1[p] = nums1[i];
i--;
}else{
nums1[p] = nums2[j];
j--;
}
p--;
}
while(i>=0){//nums1长些
nums1[p] = nums1[i];
i--;
p--;
}
while(j>=0){
nums1[p] = nums2[j];
j--;
p--;
}
}
return nums1;
};
其实观察以上代码我们还可以精简
var merge = function(nums1, m, nums2, n) {
if(m ==0&&n==0) return;
if(m==0&&n!=0){
for(var i = 0;i<n;i++){
nums1[i]=nums2[i];
}
}
if(m!=0&&n!=0){
var i = m-1, j = n-1, p = m+n-1;
//while(j>=0&&i>=0){
while(j>=0){
//if(nums1[i]>nums2[j]){
if(nums1[i]>nums2[j]&&i>=0){
nums1[p] = nums1[i];
i--;
}else{
nums1[p] = nums2[j];
j--;
}
p--;
}
// while(i>=0){//nums1长些
// nums1[p] = nums1[i];
// i--;
// p--;
// }
// while(j>=0){
// nums1[p] = nums2[j];
// j--;
// p--;
// }
}
return nums1;
};
更精简的:
var merge = function(nums1, m, nums2, n) {
var i = m - 1, j = n - 1, position = m + n - 1;
while (j >= 0) {
nums1[position--] =
( i >= 0 && nums1[i] > nums2[j] ) ? nums1[i--] : nums2[j--];
}
return nums1;
};
over