Leetcode算法Java全解答--75. 颜色分类
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. 颜色分类相关推荐
- Leetcode算法Java全解答--37. 解数独
Leetcode算法Java全解答–37. 解数独 文章目录 Leetcode算法Java全解答--37. 解数独 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 编写一个 ...
- Leetcode算法Java全解答--19. 删除链表的倒数第N个节点
Leetcode算法Java全解答–19. 删除链表的倒数第N个节点 文章目录 Leetcode算法Java全解答--19. 删除链表的倒数第N个节点 题目 想法 结果 总结 代码 我的答案 大佬们的 ...
- Leetcode算法Java全解答--41. 缺失的第一个正数
Leetcode算法Java全解答–41. 缺失的第一个正数 文章目录 Leetcode算法Java全解答--41. 缺失的第一个正数 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 ...
- Leetcode算法Java全解答--12. 整数转罗马数字
Leetcode算法Java全解答–12. 整数转罗马数字 文章目录 Leetcode算法Java全解答--12. 整数转罗马数字 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 ...
- Leetcode算法Java全解答--60. 第k个排列
Leetcode算法Java全解答–60. 第k个排列 文章目录 Leetcode算法Java全解答--60. 第k个排列 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 ...
- Leetcode算法Java全解答--73. 矩阵置零
Leetcode算法Java全解答–73. 矩阵置零 文章目录 Leetcode算法Java全解答--73. 矩阵置零 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 给定 ...
- Leetcode算法Java全解答--16. 最接近的三数之和
Leetcode算法Java全解答–16. 最接近的三数之和 文章目录 Leetcode算法Java全解答--16. 最接近的三数之和 题目 想法 结果 总结 代码 我的答案 暴力破解 滑动列表 大佬 ...
- Leetcode算法Java全解答--17. 电话号码的字母组合
Leetcode算法Java全解答–17. 电话号码的字母组合 文章目录 Leetcode算法Java全解答--17. 电话号码的字母组合 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用 ...
- 【leetcode】75.颜色分类(多种解法,超详细图文解析)
75. 颜色分类 难度中等 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,**原地**对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 ...
最新文章
- springmvc 前端传给后台中文数据时,会产生乱码
- netflix 数据科学家_数据科学和机器学习在Netflix中的应用
- 【华为云技术分享】【一统江湖的大前端】PPT制作库impress.js
- pythonfor循环例句_Python for 循环语句
- 落花美眷,终究抵不过逝水流连,回忆我的2016,展望2017。
- PHP 处理execl的数据
- 幂次方计算_4.初中数学:怎么求n的m次方的值?幂的运算,单项式相乘,基础常见考试题...
- WPS Office 2019政府定制版本 2019.1.15版
- Java实现微信公众号自动回复
- mpeg2是信源还是信道编码_hdb3编码到底属于信源编码还是信道编码?
- 网站小图标 (favicon) 的正确设置
- Linux命令行使用bypy上传文件到百度网盘
- 怎样批量将图片转成PDF格式?图片转换PDF操作方法
- 机票预订系统活动图_机票预订系统程序实施方案说明书模板(面向对象)
- 磁盘必须经过初始化,逻辑磁盘管理器才能访问——笔记本硬盘作为移动硬盘使用时遇到的问题...
- 题目 1536: 最长单词
- 讲一个玩 HASS 一年的故事
- Cool Edit之扫频波的生成
- 2018年——幻灭 2019年——重启
- 怎样循序渐进、有效地学习JavaScript?
热门文章
- 前端性能优化:启用 gzip
- php修改父进程变量,shell子进程修改父进程的环境变量值
- 滑动平均滤波_单片机数字滤波算法如何实现?(附代码)
- java编写坦克大战
- 专门搜安全员题目的考试搜题软件有没有?
- 【车牌识别】基于模板匹配算法的车牌识别门禁系统附matlab代码
- js室内地图开发_three.js搭建室内场景教程
- java实现使用代码压缩文件_Jenkins:使用SonarQube实现代码审查
- 大脑结构和功能复杂网络的图论分析——回顾复杂大脑网络的各种实验方法(包括人类的结构和功能MRI,扩散张量成像,磁脑图和脑电图),介绍图论的基本原理
- DPABISurf的安装及使用(windows系统)