力扣第75题(荷兰国旗问题)

题目:

  给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

注意:
  不能使用代码库中的排序函数来解决这道题。

第一种分析:

  考虑使用桶排序,因为只有红白蓝三种颜色,且分别用0、1、2代表,那么就可以将颜色代码作为键值,作为桶标记,将相同颜色的元素放入同一个桶中,然后再正序遍历各个桶存入到原数组,时间复杂度是线性的,o(3+n),n是元素的个数。

    public void sortColors(int[] nums) {
        if (nums.length == 0 || nums == null){
            return;
        }
        int[] bucket = new int[3];
        for (int num : nums) {
            if (num == 0){
                bucket[0]++;
            }else if (num == 1){
                bucket[1]++;
            }else if (num == 2){
                bucket[2]++;
            }
        }
        int k = 0;
        for (int i = 0; i < bucket.length; i++) {
            for (int j = 0; j < bucket[i]; j++) {
                nums[k++] = i;
            }
        }
    }

 

未完待续。。。。。

posted @ 2020-05-25 21:15  有心有梦  阅读(276)  评论(0编辑  收藏  举报