leetcode-數組-簡單-合併兩個有序數組

題目

給你兩個有序整數數組 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成爲一個有序數組。

說明:

  • 初始化 nums1 和 nums2 的元素數量分別爲 m 和 n 。
  • 你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來保存 nums2 中的元素。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-sorted-array
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

輸入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

輸出: [1,2,2,3,5,6]

解答

方法一:

第一個想法就是兩個數組都拿出自己的元素進行對比,對比之後放到一個臨時空間裏。最後把臨時空間的數據拷貝到nums1裏邊。

這個需要考慮一個問題就是循環的次數,m和n 誰先把自己的元素比較完成,然後剩下的元素補充到臨時空間的後邊就行。

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        //數組2是空的話,直接可以返回
        if (nums2.empty()) {
            return;
        }
        //數組1 沒有元素的話直接吧數組2拷貝過來就可以
        if (m == 0) {
            std::copy(nums2.begin(), nums2.end(), nums1.begin());
            return;
        }
        //利用額外空間
        vector<int> res;
        res.reserve(nums1.size());
        int index1 = 0, index2 = 0, count = 0;
        for (;index1 < m && index2 < n;) {
            if (nums1[index1] <= nums2[index2]) {
                res.push_back(nums1[index1]);
                index1++;
            } else {
                res.push_back(nums2[index2]);
                index2++;
            }
        }
        if (index1 == m && index2 < n) {
           for (; index2 < n; index2++) {
               res.push_back(nums2[index2]);
           }
           // std::copy(nums2.begin() + index2 , nums2.end(), std::back_inserter(res));
        } else if (index1 < m && index2 == n) {
           for (; index1 < m; index1++) {
               res.push_back(nums1[index1]);
           }
           //std::copy(nums1.begin() + index1 , nums1.begin() + m,std::back_inserter(res));
        } else {
        }
        std::copy(res.begin(), res.end(), nums1.begin());
    }
};

方法二:

這個也沒啥特殊的想法,就是直接把數組二copy給數組一,然後來個排序操作。

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        std::copy(nums2.begin(), nums2.end(), nums1.begin() + m);
        std::sort(nums1.begin(), nums1.end());
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章