這是我參與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.把數組組合在一塊兒
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)) */
複製代碼
思路
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) */
複製代碼
這道題考察的若是經過迭代 雙指針和原生的方法來 合併升序數組
你們能夠看看我分享的一個專欄(前端搞算法)裏面有更多關於算法的題目的分享,但願可以幫到你們,我會盡可能保持天天晚上更新,若是喜歡的麻煩幫我點個贊,十分感謝
文章內容目的在於學習討論與分享學習算法過程當中的心得體會,文中部分素材來源網絡,若有侵權,請聯繫刪除,郵箱 182450609@qq.com