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ì)還是一道排序的題,題目中給出提示說可以用計(jì)數(shù)排序,需要遍歷數(shù)組兩遍,那么先來看這種方法,因?yàn)閿?shù)組中只有三個(gè)不同的元素,所以實(shí)現(xiàn)起來很容易。
- 首先遍歷一遍原數(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ù)組來求解,那么就需要用雙指針來做,分別從原數(shù)組的首尾往中心移動。
- 定義 red 指針指向開頭位置,blue 指針指向末尾位置。
- 從頭開始遍歷原數(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)的方式來寫,那么就需要一個(gè)變量 cur 來記錄當(dāng)前遍歷到的位置,參見代碼如下:
解法三:
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)容請搜索腳本之家以前的文章或繼續(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.詞語搜索)
- 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)文章
C語言詳細(xì)分析不同類型數(shù)據(jù)在內(nèi)存中的存儲
使用編程語言進(jìn)行編程時(shí),需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么2022-08-08從頭學(xué)習(xí)C語言之for語句和循環(huán)嵌套
這篇文章主要為大家詳細(xì)介紹了C語言之for語句和循環(huán)嵌套,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01舉例講解C語言的fork()函數(shù)創(chuàng)建子進(jìn)程的用法
fork函數(shù)是Linux下一個(gè)近乎專有的C語言函數(shù),因?yàn)槭褂脮r(shí)需要調(diào)用unistd.h這個(gè)頭文件,這里我們就在Linux環(huán)境下舉例講解C語言的fork()函數(shù)創(chuàng)建子進(jìn)程的用法,需要的朋友可以參考下2016-06-06