題目描述:
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