日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

双指针算法(四):力扣 88.合并两个有序数组 | 经典例题

發布時間:2025/3/20 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双指针算法(四):力扣 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.合并两个有序数组 | 经典例题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。