力扣 题目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 }
View Code

前->后

 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 }
View Code

 

posted @ 2022-07-11 15:54  无聊的阿库娅  阅读(34)  评论(0编辑  收藏  举报