C++實(shí)現(xiàn)LeetCode(75.顏色排序)
[LeetCode] 75. Sort Colors 顏色排序
Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.
Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
Note: You are not suppose to use the library's sort function for this problem.
Example:
Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]
Follow up:
- A rather straight forward solution is a two-pass algorithm using counting sort.
First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's. - Could you come up with a one-pass algorithm using only constant space?
這道題的本質(zhì)還是一道排序的題,題目中給出提示說(shuō)可以用計(jì)數(shù)排序,需要遍歷數(shù)組兩遍,那么先來(lái)看這種方法,因?yàn)閿?shù)組中只有三個(gè)不同的元素,所以實(shí)現(xiàn)起來(lái)很容易。
- 首先遍歷一遍原數(shù)組,分別記錄 0,1,2 的個(gè)數(shù)。
- 然后更新原數(shù)組,按個(gè)數(shù)分別賦上 0,1,2。
解法一:
class Solution {
public:
void sortColors(vector<int>& nums) {
vector<int> colors(3);
for (int num : nums) ++colors[num];
for (int i = 0, cur = 0; i < 3; ++i) {
for (int j = 0; j < colors[i]; ++j) {
nums[cur++] = i;
}
}
}
};
題目中還要讓只遍歷一次數(shù)組來(lái)求解,那么就需要用雙指針來(lái)做,分別從原數(shù)組的首尾往中心移動(dòng)。
- 定義 red 指針指向開(kāi)頭位置,blue 指針指向末尾位置。
- 從頭開(kāi)始遍歷原數(shù)組,如果遇到0,則交換該值和 red 指針指向的值,并將 red 指針后移一位。若遇到2,則交換該值和 blue 指針指向的值,并將 blue 指針前移一位。若遇到1,則繼續(xù)遍歷。
解法二:
class Solution {
public:
void sortColors(vector<int>& nums) {
int red = 0, blue = (int)nums.size() - 1;
for (int i = 0; i <= blue; ++i) {
if (nums[i] == 0) {
swap(nums[i], nums[red++]);
} else if (nums[i] == 2) {
swap(nums[i--], nums[blue--]);
}
}
}
};
當(dāng)然我們也可以使用 while 循環(huán)的方式來(lái)寫(xiě),那么就需要一個(gè)變量 cur 來(lái)記錄當(dāng)前遍歷到的位置,參見(jiàn)代碼如下:
解法三:
class Solution {
public:
void sortColors(vector<int>& nums) {
int left = 0, right = (int)nums.size() - 1, cur = 0;
while (cur <= right) {
if (nums[cur] == 0) {
swap(nums[cur++], nums[left++]);
} else if (nums[cur] == 2) {
swap(nums[cur], nums[right--]);
} else {
++cur;
}
}
}
};
到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(75.顏色排序)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)顏色排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++實(shí)現(xiàn)LeetCode(85.最大矩形)
- C++實(shí)現(xiàn)LeetCode(82.移除有序鏈表中的重復(fù)項(xiàng)之二)
- C++實(shí)現(xiàn)LeetCode(81.在旋轉(zhuǎn)有序數(shù)組中搜索之二)
- C++實(shí)現(xiàn)LeetCode(80.有序數(shù)組中去除重復(fù)項(xiàng)之二)
- C++實(shí)現(xiàn)LeetCode(79.詞語(yǔ)搜索)
- C++實(shí)現(xiàn)LeetCode(76.最小窗口子串)
- C++實(shí)現(xiàn)LeetCode(74.搜索一個(gè)二維矩陣)
- C++實(shí)現(xiàn)LeetCode(73.矩陣賦零)
- C++實(shí)現(xiàn)LeetCode(137.單獨(dú)的數(shù)字之二)
相關(guān)文章
OpenCV+Qt實(shí)現(xiàn)圖像處理操作工具的示例代碼
這篇文章主要介紹了利用OpenCV+Qt實(shí)現(xiàn)圖像處理操作工具,可以實(shí)現(xiàn)雪花屏、高斯模糊、中值濾波、毛玻璃等操作,感興趣的可以了解一下2022-08-08
C語(yǔ)言進(jìn)階教程之循環(huán)語(yǔ)句缺陷詳析
循環(huán)語(yǔ)句是用于重復(fù)執(zhí)行某條語(yǔ)句(循環(huán)體)的語(yǔ)句,它包含一個(gè)控制表達(dá)式,每循環(huán)執(zhí)行一次都要對(duì)控制表達(dá)式進(jìn)行判斷,如果表達(dá)式為真,則繼續(xù)執(zhí)行循環(huán),這篇文章主要給大家介紹了關(guān)于C語(yǔ)言進(jìn)階教程之循環(huán)語(yǔ)句缺陷的相關(guān)資料,需要的朋友可以參考下2021-08-08
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易網(wǎng)絡(luò)聊天室
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易網(wǎng)絡(luò)聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
C++中vector<vector<int>?>的基本使用方法
vector<vector<int>?>其實(shí)就是容器嵌套容器,外層容器的元素類型是vector<int>,下面這篇文章主要給大家介紹了關(guān)于C++中vector<vector<int>?>的基本使用方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
C語(yǔ)言編程實(shí)例之輸出指定圖形問(wèn)題
這篇文章主要介紹了C語(yǔ)言編程實(shí)例之輸出指定圖形問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
C++中vector容器的常用操作方法實(shí)例總結(jié)
vector容器一般被用作創(chuàng)建動(dòng)態(tài)數(shù)組,動(dòng)態(tài)數(shù)組就像Python中的list結(jié)構(gòu)一樣,可以比普通數(shù)組擁有更豐富操作方法,下面就為大家整理了一些最常用的操作:2016-05-05

