博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LeetCode】75-颜色分类
阅读量:5303 次
发布时间:2019-06-14

本文共 1604 字,大约阅读时间需要 5 分钟。

题目描述

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

注意:

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

示例:

输入: [2,0,2,1,1,0]输出: [0,0,1,1,2,2]

进阶:

  • 一个直观的解决方案是使用计数排序的两趟扫描算法。
    首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
  • 你能想出一个仅使用常数空间的一趟扫描算法吗?

解题思路

这一题实际上就是经典的荷兰国旗问题

我们将乱序的红白蓝三色小球排列成有序的红白蓝三色的同颜色在一起的小球组。这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。

注意,这个问题最后要求最后的结果是有序排列的,就这一题来说,最后的结果必须是[0,0,1,1,2,2]这种形式的,而不能是[1,1,0,0,2,2]这种顺序不对的。

从左到右遍历一遍数组,使用三个指针,left,rightcurrent,其中left使得nums[l0...left-1]中的元素都小于vright使得nums[right+1...hi]中的元素都大于vcurrent使得nums[left...current-1]中的元素都等于v。在遍历过程中:

  • nums[current] < v,将nums[left]nums[current]交换,将leftcurrent加一
  • nums[current] > v,将nums[right]nums[current]交换,将right减一
  • nums[current] = v,将i加一

Java 实现

class Solution {    public void sortColors (int[] nums) {        sort(nums, 0, nums.length - 1);    }    private static void sort (int[] nums, int lo, int hi) {        if (hi <= lo) return;        int left = lo, current = lo + 1, right = hi;        int v = nums[lo];        while (current <= right) {            if (nums[current] < v) exch(nums, left++, current++);            else if (nums[current] > v) exch(nums, current, right--);            else current++;        }        sort(nums, lo, left - 1);        sort(nums, right + 1, hi);    }    private static void exch (int[] a, int i, int j) {        int temp = a[i];        a[i] = a[j];        a[j] = temp;    }}

心得体会

  • 这一题结合快速排序中的相关知识就比较好理解了

  • 一个集合中含有大量重复元素时,使用三向切分快速排序比经典的快速排序更有效率,因为它避免将一个有很多重复的子集继续切分为更小的子集


参考:《算法》第四版,187页,2.3.3.3 熵最优的排序

转载于:https://www.cnblogs.com/yuzhenzero/p/10438086.html

你可能感兴趣的文章
实验10 编写子程序 1.显示字符串
查看>>
Effect-Compiler Tool(fxc.exe)
查看>>
django中的缓存 单页面缓存,局部缓存,全站缓存 跨域问题的解决
查看>>
常见HTTP状态码(200、301、302、500等)
查看>>
Atiti.大企业病与小企业病 大公司病与小公司病
查看>>
处理器管理与进程调度
查看>>
解决随机数生成的坐标在对角线上的问题
查看>>
服务器ganglia安装
查看>>
ps aux 状态介绍
查看>>
二级指针内存模型
查看>>
bzoj千题计划140:bzoj4519: [Cqoi2016]不同的最小割
查看>>
AsyncTask 异步 URL请求加载图片并保存到本地sd卡
查看>>
ansible-playbook-常用
查看>>
【English】七、常见动词
查看>>
formatDate
查看>>
一个小小的測试题,求解(欢迎解答)
查看>>
Android之SystemUI载入流程和NavigationBar的分析
查看>>
layer 常用弹出
查看>>
170803、springboot jar包启动提示没有主清单属性
查看>>
void*类型的指针
查看>>