LeetCode算法學習之--數組--合併兩個有序數組

這是我參與8月更文挑戰的第2天,活動詳情查看:8月更文挑戰javascript

你們好今天給你們分享下一道 LeetCode 簡單難度 的題目合併兩個有序數組前端

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

初始化 nums1 和 nums2 的元素數量分別爲 m 和 n 。你能夠假設 nums1 的空間大小等於 m + n,這樣它就有足夠的空間保存來自 nums2 的元素。算法

題目

將兩個升序鏈表合併爲一個新的 升序 鏈表並返回。新鏈表是經過拼接給定的兩個鏈表的全部節點組成的。數組

示例 1:

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

輸入:nums1 = [1], m = 1, nums2 = [], n = 0
輸出:[1]
複製代碼

分析

1.2個都爲有序數組markdown

2.num1.len = m+n網絡

3.合併到num1上去app

解法ide

1.迭代oop

2.sort

3.逆向雙指針

解法一:迭代法

思路
1.添加一個條額外的數組res來存儲值
2.迭代比較2個的大小,小的放入res中
3.若是有數組還有剩餘的值 則所有放入res
4.再用res 更新nums1
*/

var merge = function (nums1, m, nums2, n) {
  // 建立一個額外的數組
  let res = [];
  let i = 0,
    j = 0;

  // 由於nums1的0是佔位符,能夠先移除
  nums1 = nums1.slice(0, m - n);

  // 先迭代這2個數組
  while (i < m && j < n) {
    // 比較他們的大小
    if (nums1[i] <= nums2[j]) {
      res.push(nums1[i++]);
    } else {
      res.push(nums2[j++]);
    }
  }

  // 處理剩下的數組元素
  res = res.concat(nums1.slice(i, m));
  res = res.concat(nums2.slice(j, n));

  for (let i = 0; i < res.length; i++) {
    nums1[i] = res[i];
  }
};
/* 複雜度 時間 O(n+m) 空間 O(n+m) */
複製代碼

1.png

解法二:sort

思路 
1.把數組組合在一塊兒
2.在使用sort的方式變成一個有序數組

*/

var merge = function (nums1, m, nums2, n) {
  // 合併數組
  for (let i = 0; i < n; i++) {
    nums1[i + m] = nums2[i];
  }

  // 使用sort 排序
  nums1.sort((a, b) => a - b);
};

/* 複雜度 時間 O((n+m)log(n+m)) 空間 O(log(m+n)) */
複製代碼

2.png

解法三:逆向雙指針

思路
1.由於num1.len = m+n
2.由於正向比較修改nums1,當nums2比num1小的時候,會丟失Nums1的元素
3.因此採起逆向比較

*/

// 代碼借鑑 https://leetcode-cn.com/problems/merge-sorted-array/solution/
var merge = function (nums1, m, nums2, n) {
  let i = m - 1;
  let j = n - 1;
  //設置這個數組的指針
  let cur = m + n - 1;

  while (i >= 0 || j >= 0) {
    // 說明nums1元素已經插入完了
    if (i < 0) {
      nums1[cur--] = nums2[j--];
      // 說明nums2元素已經插入完了
    } else if (j < 0) {
      nums1[cur--] = nums1[i--];
    } else {
      // 比較大小,大的先放
      if (nums1[i] >= nums2[j]) {
        nums1[cur--] = nums1[i--];
      } else {
        nums1[cur--] = nums2[j--];
      }
    }
  }
};

/* 複雜度 時間 O(n+m) 空間 O(1) */
複製代碼

3.png

總結

這道題考察的若是經過迭代 雙指針和原生的方法來 合併升序數組

你們能夠看看我分享的一個專欄(前端搞算法)裏面有更多關於算法的題目的分享,但願可以幫到你們,我會盡可能保持天天晚上更新,若是喜歡的麻煩幫我點個贊,十分感謝

文章內容目的在於學習討論與分享學習算法過程當中的心得體會,文中部分素材來源網絡,若有侵權,請聯繫刪除,郵箱 182450609@qq.com

相關文章
相關標籤/搜索