欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode75. Sort Colors

程序员文章站 2022-03-11 11:51:58
...

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?

https://leetcode.com/problems/sort-colors/discuss/26472/Share-my-at-most-two-pass-constant-space-10-line-solution

The idea is to sweep all 0s to the left and all 2s to the right, then all 1s are left in the middle. 

原始方法是用简单的冒泡法排序做的。

https://github.com/abesft/leetcode/blob/master/75SortColors/75SortColors.cpp

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;

/*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]*/


class Solution {
public:
#if 0
	void sortColors(vector<int>& nums) {
		//bubble sort
		int length = nums.size();
		for (size_t i = 0; i < length; i++)
		{
			for (size_t j = length - 1; j > i; j--)
			{
				if (nums[i] > nums[j])
					swap(nums[i], nums[j]);
			}
		}
	}
#else
	void sortColors(vector<int>& nums) {
		//The idea is to sweep all 0s to the left and all 2s to the right, then all 1s are left in the middle.
		//https://leetcode.com/problems/sort-colors/discuss/26472/Share-my-at-most-two-pass-constant-space-10-line-solution
		int zero = 0, second = nums.size() - 1;
		for (int i =0; i <= second; i++)
		{
			while (nums[i] == 2 && i < second) swap(nums[i], nums[second--]);
			while (nums[i] == 0 && i > zero) swap(nums[i], nums[zero++]);
		}
	}
#endif // 0
};

int main()
{
	Solution sln;
	vector<int> nums{ 2,0,2,1,1,0 };
	sln.sortColors(nums);
	for (auto & i : nums)
		cout << i << " ";
	std::cout << "Hello World!\n";
}

 

相关标签: sort