【LeetCode】75. Sort Colors(颜色排序)-C++实现的两种方法及超详细图解

问题描述:

一、第一种解题方法-计数排序法 

(1)分别统计0,1,2的元素个数

        int count[3] = {0};    // 存放0, 1, 2三个元素的频率
        for(int i = 0 ; i < nums.size() ; i ++){
            assert(nums[i] >= 0 && nums[i] <= 2);
            count[nums[i]] ++;
        }

 注意:assert(nums[i] >= 0 && nums[i] <= 2),养成判断错误的习惯

(2) 然后,重新放回到到数组中

        int index = 0;
        for(int i = 0 ; i < count[0] ; i ++)
            nums[index++] = 0;
        for(int i = 0 ; i < count[1] ; i ++)
            nums[index++] = 1;
        for(int i = 0 ; i < count[2] ; i ++)
            nums[index++] = 2;

(3)第一种解法完整实现代码:

#include <cassert>

using namespace std;

// 75. Sort Colors
// https://leetcode.com/problems/sort-colors/description/
//
// 计数排序的思路
// 对整个数组遍历了两遍
// 时间复杂度: O(n)
// 空间复杂度: O(k), k为元素的取值范围
class Solution {
public:
    void sortColors(vector<int> &nums) {

        int count[3] = {0};    // 存放0, 1, 2三个元素的频率
        for(int i = 0 ; i < nums.size() ; i ++){
            assert(nums[i] >= 0 && nums[i] <= 2);
            count[nums[i]] ++;
        }

        int index = 0;
        for(int i = 0 ; i < count[0] ; i ++)
            nums[index++] = 0;
        for(int i = 0 ; i < count[1] ; i ++)
            nums[index++] = 1;
        for(int i = 0 ; i < count[2] ; i ++)
            nums[index++] = 2;

            }
};

int main() {

    int nums[] = {2, 2, 2, 1, 1, 0};
    vector<int> vec = vector<int>(nums, nums + sizeof(nums)/sizeof(int));

    Solution().sortColors(vec);
    for(int i = 0 ; i < vec.size() ; i ++)
        cout << vec[i] << " ";
    cout << endl;

    return 0;
}

二、第二种解题方法-三路快速排序法(Quick Sort 3 Ways)

(1)先用动画演示解题思路

扫描二维码关注公众号,回复: 2913861 查看本文章

①将数组分成3个部分

②回到本题,我们需要对0,1,2进行排序

 ③将数组按元素0,1,2分成三个部分

 

④ 使用下标 i 作为遍历,此时arr[ i ] = e

 若e = 1,则arr[ i ] = e; 然后 i++

⑤若arr[ i ] = e, e = 2;则two--;swap( nums[i] , nums[two])

 

 

 

⑥最后完成数组的排序

 

 (2)第二种解题方法的实现代码

// 三路快速排序的思想
// 对整个数组只遍历了一遍
// 时间复杂度: O(n)
// 空间复杂度: O(1)
class Solution {
public:
    void sortColors(vector<int> &nums) {

        int zero = -1;          // [0...zero] == 0
        int two = nums.size();  // [two...n-1] == 2
        for(int i = 0 ; i < two ; ){
            if(nums[i] == 1)
                i ++;
            else if (nums[i] == 2){
				--two;
                swap( nums[i] , nums[two]);
			}
            else{ // nums[i] == 0
                assert(nums[i] == 0);
				++zero;
                swap(nums[zero] , nums[i]);
				i++;
            }
        }
    }
};

int main() {

    int nums[] = {2, 2, 2, 1, 1, 0};
    vector<int> vec = vector<int>(nums, nums + sizeof(nums)/sizeof(int));

    Solution().sortColors(vec);
    for(int i = 0 ; i < vec.size() ; i ++)
        cout << vec[i] << " ";
    cout << endl;

    return 0;
}

参考资料:

https://coding.imooc.com/class/chapter/82.html#Anchor

猜你喜欢

转载自blog.csdn.net/qq_40416052/article/details/82110646