力扣 题目88- 合并两个有序数组
题目
题解
这种题 一看 我们直接先从后面向前想
很容易能想到我们谁大取谁 这里的向后 分别是指m n 以及遍历的nums1->p= m+ n - 1;
nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
一开始
nums1 [m]=3 nums2[n] =6 所以nums1 [p]=6;->p--;n-- ->1 2 3 0 0 6
nums1 [m]=3 nums2[n] =5 所以nums1 [p]=5;->p--;n-- ->1 2 3 0 5 6
nums1 [m]=3 nums2[n] =2 所以nums1 [p]=3;->p--;m-- ->1 2 3 3 5 6
nums1 [m]=2 nums2[n] =2 所以nums1 [p]=2;->p--;n-- ->1 2 2 3 5 6
即可
1 int p = m-- + n-- - 1; 2 while (m >= 0 && n >= 0) { 3 nums1[p--] = nums1[m] > nums2[n] ? nums1[m--] : nums2[n--]; 4 }
但是我们发现 如果nums2 的值比nums1 的第一个值小呢?那么最后nums2 剩下的都是小的
那么我们直接nums1[p--] = nums2[n--];
//这里是比nums1的第一个还小的 nums2数值直接替换前面的数字即可 while (n >= 0) { nums1[p--] = nums2[n--]; }
当然 其实这题从前往后也可以做 但是很多条件没用到 说明这题的本意不是这个 所以这里不说了 有兴趣可以看代码
代码
后->前
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 class Solution { 5 public: 6 void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { 7 int p = m-- + n-- - 1; 8 while (m >= 0 && n >= 0) { 9 nums1[p--] = nums1[m] > nums2[n] ? nums1[m--] : nums2[n--]; 10 } 11 12 while (n >= 0) { 13 nums1[p--] = nums2[n--]; 14 } 15 } 16 }; 17 18 int main() { 19 Solution sol; 20 vector<int> nums1 = { 2,0 }; 21 int m = 1; 22 vector<int> nums2 = { 1 }; 23 int n = 1; 24 sol.merge(nums1,m, nums2,n); 25 for (int i = 0; i < nums1.size(); i++) { 26 cout << nums1[i] << " "; 27 } 28 }
前->后
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 class Solution { 5 public: 6 void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { 7 if (n == 0) { 8 return; 9 } 10 int ergodic = 0; 11 for (int i = 0; i < nums1.size()&& ergodic<n; i++) { 12 if (nums1[i] == 0&&i>m-1) { 13 nums1[i] = nums2[ergodic]; 14 ergodic++; 15 } 16 else if(nums1[i] >= nums2[ergodic]) 17 { 18 nums1.insert(nums1.begin()+i, nums2[ergodic]); 19 nums1.pop_back(); 20 ergodic++; 21 m++; 22 } 23 } 24 } 25 }; 26 27 int main() { 28 Solution sol; 29 vector<int> nums1 = { 2,0 }; 30 int m = 1; 31 vector<int> nums2 = { 1 }; 32 int n = 1; 33 sol.merge(nums1,m, nums2,n); 34 for (int i = 0; i < nums1.size(); i++) { 35 cout << nums1[i] << " "; 36 } 37 }