目錄
🚩了解題意
🚩算法分析
第一種方法:雙指針
🚩代碼實現一
第二種方法:三指針
🚩代碼實現二
🚩了解題意
本題將整數0,1,2代表紅白籃,nums中的整數并不是按照紅白藍的順序排列,我們要做的就是讓nums中的整數按紅白藍排列,比如樣例中的nums={2,0,2,1,1,0}最終按照紅0白1籃2的順序排列,最終的結果是{0,0,1,1,2,2}。
就是將0紅排列在一起,1白排列在一起,2藍排列在一起。
🚩算法分析
第一種方法:雙指針
利用i進行遍歷數組,ptr來進行劃分范圍,最終得到的結果是
[0,ptr-1] 紅色
[ptr,size-1] 白色和藍色
如果nums[i]==0的時候我們就將nums[i]的值和nums[ptr]的值交換,然后ptr++
i遍歷完之后,我們看到所有的0都再最左邊,再進行一次遍歷,但是這時候的i是從ptr開始的
因為上面nums[i]和nums[ptr]交換位置之后,ptr++,所以ptr再下標2的位置。i從下標2開始進行。
如果遇到nums[i]==1的時候,我們就將nums[i]和nums[ptr]交換位置,ptr++。
🚩代碼實現一
class Solution {
public:void sortColors(vector<int>& nums) {int n = nums.size();int ptr = 0;for (int i = 0; i < n; ++i) {if (nums[i] == 0) {swap(nums[i], nums[ptr]);++ptr;}}for (int i = ptr; i < n; ++i) {if (nums[i] == 1) {swap(nums[i], nums[ptr]);++ptr;}}}
};
第二種方法:三指針
利用i來遍歷數組,left作為左指針,right作為右指針
如果nums[i]==0,先讓left++,然后與nums[i]和nums[left]交換位置,然后i++。
如果nums[i]==2,先讓--right,然后與nums[i]和nums[right]交換位置。
注意:這里的i并不往后走,因為i是待掃描的區域,就是Num[i]是未知的數字,我們要繼續判斷nums[i]是等于多少,再進行一次判斷。
此時繼續判斷nums[i]等于多少,此時的nums[i]==2,那么讓right先--,然后交換nums[i]和nums[right]的值。
如果我們不知道nums[i]的值,我們就不能讓i++.
如果nums[i]==1,我們直接就讓i++
最終的循環判斷條件就是 i<right即可,i與right相遇就結束循環。
🚩代碼實現二
class Solution {
public:void sortColors(vector<int>& nums) {int left=-1,right=nums.size();int n=nums.size();int i=0;while(i<right){if(nums[i]==0)swap(nums[++left],nums[i++]);else if(nums[i]==1)i++;else swap(nums[--right],nums[i]);//此時的i不能++,因為i對應的值是未掃描的部分}}
};
關關難過。