双指针解决数组排序问题
這個(gè)問(wèn)題如果注意,用一句就可以解決
sort(nums.begin(),nums.end());完事。但是人家明確說(shuō)了,不能用代碼庫(kù)中的排序函數(shù)。我們就得自己去實(shí)現(xiàn)排序。其實(shí)這個(gè)問(wèn)題很簡(jiǎn)單,因?yàn)槔锩嬷挥腥N顏色,用0 1 2 表示。思想也很簡(jiǎn)單,就是我們用雙指針遍歷數(shù)組。如果遇到0放在前面,遇到1就在那個(gè)位置,遇到2跳到最后。代碼如下,個(gè)人感覺(jué)用雙指針來(lái)解決數(shù)組的排序問(wèn)題特別好使。
class Solution { public:void sortColors(vector<int>& nums) {int n=nums.size();int tmp=0,i=0;while(i<n){if(nums[i]==0)swap(nums[tmp++],nums[i++]);else if(nums[i]==1)i++;elseswap(nums[i],nums[--n]);}} };合并區(qū)間也可以用雙指針去解決一個(gè)指針用來(lái)指向當(dāng)前元素,一個(gè)指針指向當(dāng)前元素的下一個(gè)元素。
我們首先利用sort函數(shù)對(duì)數(shù)組進(jìn)行排序,排序之后我們可以更方便的去比較。
?
這個(gè)題我們可以分情況討論。首先最簡(jiǎn)單的情況就是不交叉比如[1,3][4,9]。即n[i][0]>c[i][1]
其中n代表下一個(gè)指針,c代表當(dāng)前指針。這個(gè)時(shí)候直接將當(dāng)前元素[1,3]直接保存即可無(wú)需再比較。只需要拿著[4,9]去和后邊的比較。
第二種情況[4,9][5,8]前面的包含后邊的。用代碼表示即n[i][1]<=c[i][1]這個(gè)時(shí)候不用管[5,8],因?yàn)閇5.8]已經(jīng)包含于[4,9],拿著[4,9]和后邊的數(shù)繼續(xù)進(jìn)行比較。即n++,c不變。
最后一種情況,就是有重疊的情況,[4,9][7,10]這種只需零[4,9]中的9等于10即可用代碼表示,c[i][1]=n[i][1]即可,n=++完事
貼代碼
class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {if (intervals.size() == 0 || intervals.size() == 1) return intervals;int u = 0, v = 0;vector<vector<int>> ans;// 思路①sort(intervals.begin(), intervals.end());// 思路②while (v < intervals.size()) { if (intervals[v][0] > intervals[u][1]) {ans.emplace_back(intervals[u]);u = v;} else if (intervals[v][1] <= intervals[u][1]) {v++;} else {intervals[u][1] = intervals[v][1];v++;}}//思路③ans.emplace_back(intervals[u]);return ans;} };?
?
?
總結(jié)
以上是生活随笔為你收集整理的双指针解决数组排序问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 车机app
- 下一篇: 回溯算法超详细讲解(附代码)