Leetcode算法Java全解答–75. 颜色分类

文章目录

  • Leetcode算法Java全解答--75. 颜色分类
    • 题目
    • 想法
    • 结果
    • 总结
    • 代码
      • 我的答案
      • 大佬们的答案
      • 测试用例
    • 其他

题目

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

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

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

进阶:

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


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

想法

遍历数组,同时拥有三个游标

left游标用来表示0的分界点(左边都是0),right游标用来表示2的分界点(右边都是2)

tmp游标表示正在游走的指针

当遇到数字2的时候,就将tmp和right的值交换,这时候right值为2,所以就把right往前移一位

当遇到数字0的时候,就将tmp和left的值交换,这时候left值为0,所以就把left往前移一位,同时tmp肯定不为2,所以往后移一位

当遇到数字0的时候,就将tmp++;

执行过程:

arr =  [2, 0, 2, 1, 1, 0],left = 0,right = 5,tmp = 0
第一轮:arr[tmp] == 2   >>  swap(arr[tmp],swap[right])  >> [0, 0, 2, 1, 1, 2],left = 0,right = 4,tmp = 0
第二轮:arr[tmp] == 0   >>  swap(arr[tmp],swap[left])  >> [0, 0, 2, 1, 1, 2],left = 1,right = 4,tmp = 1
第三轮:arr[tmp] == 0   >>  swap(arr[tmp],swap[left])  >> [0, 0, 2, 1, 1, 2],left = 2,right = 4,tmp = 2
第四轮:arr[tmp] == 2   >>  swap(arr[tmp],swap[right])  >> [0, 0, 2, 1, 1, 2],left = 2,right = 3,tmp = 2

结果

超过78%的测试案例

时间复杂度/空间复杂度:n/n

总结

代码

我的答案

public void sortColors(int[] nums) {int leftIndex = 0;int rightIndex = nums.length - 1;int tmpIndex = 0;// 0、2的时候进行交换while (tmpIndex < rightIndex) {int num = nums[tmpIndex];if (num == 1) {tmpIndex++;}if (num == 0) {swapArrByIndex(nums, tmpIndex, leftIndex);leftIndex++;tmpIndex++;}if (num == 2) {swapArrByIndex(nums, tmpIndex, rightIndex);rightIndex--;}}}
private static void swapArrByIndex(int[] arr, int index1, int index2) {int tmp = arr[index1];arr[index1] = arr[index2];arr[index2] = tmp;
}

大佬们的答案

/*************************************** 比我好的答案 better* 二次遍历法* ***********************************/
public void better(int[] nums) {int a = 0, b = 0, c = 0;for (int n : nums) {if (n == 0) {a++;} else if (n == 1) {b++;} else if (n == 2) {c++;}}for (int i = 0; i < nums.length; i++) {if (a != 0) {nums[i] = 0;a--;} else if (b != 0) {nums[i] = 1;b--;} else if (c != 0) {nums[i] = 2;c--;}}
}

测试用例

@Test
public void test075() {// 创建测试案例int[] arr1 = new int[] { 2, 0, 2, 1, 1, 0 };// 测试案例期望值int[] expResult1 = new int[] { 0, 0, 1, 1, 2, 2 };// 执行方法Solution075 solution075 = new Solution075();solution075.sortColors(arr1);// 判断期望值与实际值Assert.assertEquals(expResult1, arr1);
}

其他

代码托管码云地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git

查看其他内容可以点击专栏或者我的博客哈:https://blog.csdn.net/cmqwan

“大佬们的答案” 标签来自leetcode,侵权请联系我进行删改

如有疑问请联系,联系方式:QQ3060507060

Leetcode算法Java全解答--75. 颜色分类相关推荐

  1. Leetcode算法Java全解答--37. 解数独

    Leetcode算法Java全解答–37. 解数独 文章目录 Leetcode算法Java全解答--37. 解数独 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 编写一个 ...

  2. Leetcode算法Java全解答--19. 删除链表的倒数第N个节点

    Leetcode算法Java全解答–19. 删除链表的倒数第N个节点 文章目录 Leetcode算法Java全解答--19. 删除链表的倒数第N个节点 题目 想法 结果 总结 代码 我的答案 大佬们的 ...

  3. Leetcode算法Java全解答--41. 缺失的第一个正数

    Leetcode算法Java全解答–41. 缺失的第一个正数 文章目录 Leetcode算法Java全解答--41. 缺失的第一个正数 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 ...

  4. Leetcode算法Java全解答--12. 整数转罗马数字

    Leetcode算法Java全解答–12. 整数转罗马数字 文章目录 Leetcode算法Java全解答--12. 整数转罗马数字 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 ...

  5. Leetcode算法Java全解答--60. 第k个排列

    Leetcode算法Java全解答–60. 第k个排列 文章目录 Leetcode算法Java全解答--60. 第k个排列 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 ...

  6. Leetcode算法Java全解答--73. 矩阵置零

    Leetcode算法Java全解答–73. 矩阵置零 文章目录 Leetcode算法Java全解答--73. 矩阵置零 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 给定 ...

  7. Leetcode算法Java全解答--16. 最接近的三数之和

    Leetcode算法Java全解答–16. 最接近的三数之和 文章目录 Leetcode算法Java全解答--16. 最接近的三数之和 题目 想法 结果 总结 代码 我的答案 暴力破解 滑动列表 大佬 ...

  8. Leetcode算法Java全解答--17. 电话号码的字母组合

    Leetcode算法Java全解答–17. 电话号码的字母组合 文章目录 Leetcode算法Java全解答--17. 电话号码的字母组合 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用 ...

  9. 【leetcode】75.颜色分类(多种解法,超详细图文解析)

    75. 颜色分类 难度中等 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,**原地**对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 ...

最新文章

  1. springmvc 前端传给后台中文数据时,会产生乱码
  2. netflix 数据科学家_数据科学和机器学习在Netflix中的应用
  3. 【华为云技术分享】【一统江湖的大前端】PPT制作库impress.js
  4. pythonfor循环例句_Python for 循环语句
  5. 落花美眷,终究抵不过逝水流连,回忆我的2016,展望2017。
  6. PHP 处理execl的数据
  7. 幂次方计算_4.初中数学:怎么求n的m次方的值?幂的运算,单项式相乘,基础常见考试题...
  8. WPS Office 2019政府定制版本 2019.1.15版
  9. Java实现微信公众号自动回复
  10. mpeg2是信源还是信道编码_hdb3编码到底属于信源编码还是信道编码?
  11. 网站小图标 (favicon) 的正确设置
  12. Linux命令行使用bypy上传文件到百度网盘
  13. 怎样批量将图片转成PDF格式?图片转换PDF操作方法
  14. 机票预订系统活动图_机票预订系统程序实施方案说明书模板(面向对象)
  15. 磁盘必须经过初始化,逻辑磁盘管理器才能访问——笔记本硬盘作为移动硬盘使用时遇到的问题...
  16. 题目 1536: 最长单词
  17. 讲一个玩 HASS 一年的故事
  18. Cool Edit之扫频波的生成
  19. 2018年——幻灭 2019年——重启
  20. 怎样循序渐进、有效地学习JavaScript?

热门文章

  1. 前端性能优化:启用 gzip
  2. php修改父进程变量,shell子进程修改父进程的环境变量值
  3. 滑动平均滤波_单片机数字滤波算法如何实现?(附代码)
  4. java编写坦克大战
  5. 专门搜安全员题目的考试搜题软件有没有?
  6. 【车牌识别】基于模板匹配算法的车牌识别门禁系统附matlab代码
  7. js室内地图开发_three.js搭建室内场景教程
  8. java实现使用代码压缩文件_Jenkins:使用SonarQube实现代码审查
  9. 大脑结构和功能复杂网络的图论分析——回顾复杂大脑网络的各种实验方法(包括人类的结构和功能MRI,扩散张量成像,磁脑图和脑电图),介绍图论的基本原理
  10. DPABISurf的安装及使用(windows系统)