描述
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.
分析
meh
解决方案1(Python)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: """ Do not return anything, modify nums1 in-place instead. """ nums1Index, nums2Index = m-1, n-1 tail = m+n-1 while nums1Index >= 0 or nums2Index >= 0: if nums1Index == -1: nums1[tail] = nums2[nums2Index] nums2Index -= 1 elif nums2Index == -1: nums1[tail] = nums1[nums1Index] nums1Index -= 1 elif nums1[nums1Index] > nums2[nums2Index]: nums1[tail] = nums1[nums1Index] nums1Index -= 1 else: nums1[tail] = nums2[nums2Index] nums2Index -= 1 tail -= 1
解决方案2(C++)
先解决在再优化咯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class Solution {public : void merge (vector <int >& nums1, int m, vector <int >& nums2, int n) { vector <int > result; int i = 0 , j = 0 ; while (i < m && j < n) { if (nums1[i] <= nums2[j]) { result.push_back(nums1[i++]); }else { result.push_back(nums2[j++]); } } while (i < m) { result.push_back(nums1[i++]); } while (j < n) { result.push_back(nums2[j++]); } nums1 = result; } };
在评论区里有人 po 了一个比较hack的做法:
1 2 3 4 5 6 7 8 9 class Solution {public : void merge (vector <int >& nums1, int m, const vector <int >& nums2, int n) { std ::merge( nums1.rbegin() + (nums1.size() - m), nums1.rend(), nums2.rbegin() + (nums2.size() - n), nums2.rend(), nums1.rbegin(), greater<int >()); } };
当然,最好的情况是不增加空间复杂度,要合并两个有序的数组,可以从后往前写,这样就可以不覆盖 nums1 的元素:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Solution {public : void merge (vector <int >& nums1, int m, vector <int >& nums2, int n) { if (n <= 0 ) { return ; } for (int i = m-1 , j = n-1 , k = m+n-1 ; j >= 0 ; ) if (i >= 0 && nums1[i] >= nums2[j]) { nums1[k--] = nums1[i--]; }else { nums1[k--] = nums2[j--]; } } };
OMG,在评论区惊现王垠???2-lines-very-simple-c-solution
1 2 3 4 5 6 7 class Solution {public : void merge (vector <int >& nums1, int m, vector <int >& nums2, int n) { for (int i=m-1 , j=n-1 , k=m+n-1 ; j>=0 ; ) nums1[k--] = i>=0 && nums1[i]>nums2[j]? nums1[i--]: nums2[j--]; } };
解决方案3(Golang)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 func merge (nums1 []int , m int , nums2 []int , n int ) { for i := m+n; m > 0 && n > 0 ; i-- { if nums2[n-1 ] >= nums1[m-1 ] { nums1[i-1 ] = nums2[n-1 ] n-- } else { nums1[i-1 ] = nums1[m-1 ] m-- } } for ; n-1 >= 0 ; n-- { nums1[n-1 ] = nums2[n-1 ] } }
相关问题