双指针算法(四):力扣 88.合并两个有序数组 | 经典例题
題目描述
給你兩個有序整數數組 nums1 和 nums2,請你將 nums2 合并到 nums1 中,使 nums1 成為一個有序數組。
初始化 nums1 和 nums2 的元素數量分別為 m 和 n 。你可以假設 nums1 的空間大小等于 m + n,這樣它就有足夠的空間保存來自 nums2 的元素。
示例
示例一:
輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
輸出:[1,2,2,3,5,6]
示例二:
輸入:nums1 = [1], m = 1, nums2 = [], n = 0
輸出:[1]
解題思路
看到這個題目,當時的第一反應就是;把第二組直接放在第一組的后面,然后sort排序一次就好了;
這么做也不是不可以,就是在雙指針方法面前顯得很緩慢,而且很笨拙~
現在來看一下雙指針算法的解題思路把
首先,兩個數組是升序排列的,我們從最大值開始找(從最小值開始找也行,只不過題目給了現成的 m 和 n)
我們首先使用兩個指針就是已經給了的 m 和 n;
然后我們使用額外的一個指針,定義為 pos ,復制用,并且讓 pos = m+ n - 1;
pos 的位置,就是結果的最后面的位置;
然后,m 對應的值 和 n 對應的值進行比較;
最大的由pos復制過去,并且對應的指針前移;
如果 m 還沒有走完,但是 n 已經走完了,說明 第二個數組已經完全排序進去了,第一個剩下的部分已經是有序的,不用處理;
如果 m 走完了,但是 n 沒有走完,說明第二個數組還有剩余的沒有加入的元素,由于本身也是有序的,直接遍歷加入即可;
需要注意的是,指針的移動使用了 ++ 和 – 的性質,所以和三目運算符配合起來,非常巧妙
代碼
class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {// 方法一:添加后sort排序// for(int i=0; i<n; i++){// nums1[m++] = nums2[i];// }//把數組2替換掉數組1里的0,然后.sort()排序// sort(nums1.begin(),nums1.end());// 方法二: 雙指針算法int pos = m-- + n-- - 1; // pos指針,復制用; -1 因為是下標; 從后往前,先放較大的// 留意這個三目表達式;利用了 -- ++ 的技巧,很經典while (m >= 0 && n >= 0 ) {nums1[pos--] = nums1[m] > nums2[n] ? nums1[m--] : nums2[n--];}while (n >= 0 ) {nums1[pos--] = nums2[n--] ;}} };結果
總結
以上是生活随笔為你收集整理的双指针算法(四):力扣 88.合并两个有序数组 | 经典例题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双指针算法(三):力扣【167.两数之和
- 下一篇: pycharm 修改成中文教程(图文简单