LeetCode 分类颜色
LeetCode 分类颜色
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
进阶:
- 一个直观的解决方案是使用计数排序的两趟扫描算法。
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 - 你能想出一个仅使用常数空间的一趟扫描算法吗?
1. 使用基数排序:
class Solution:
def sortColors(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
#桶排序
count = []
for i in [0,1,2]:
count.append(nums.count(i))
j=0
for i in [0,1,2]:
while count[i]>0:
nums[j] = i
j += 1
count[i] -= 1
print(nums)
2. 使用快排:
两路快排的Partition的实现(c++):
// v为pivot,初始存储在arr[l]的位置
int j = l; // 循环过程保持 arr[l+1...j] < v ; arr[j+1...i) > v
for( int i = l + 1 ; i <= r ; i ++ )
if( arr[i] < v )
swap( arr[++j] , arr[i] );
swap( arr[l] , arr[j]); // 此时,j指向pivot的正确位置
class Solution:
def _sortColors(self, nums, l, r):
if l >= r:
return
# pratition
j = l+1
pivot = nums[l]
for i in range(l+1, r+1):
if nums[i] < pivot:
nums[i], nums[j] = nums[j], nums[i]
j += 1
j -= 1
nums[l], nums[j] = nums[j], nums[l] #devide
self._sortColors(nums, l, j-1)
self._sortColors(nums, j+1, r)
def sortColors(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
self._sortColors(nums, 0, len(nums)-1)
这样的一个快排,在面临有序或者近乎有序的数组时,会退化成为一个O(n^2)的算法。于是我们使用了一个很简单的随机选取pivot的方式来处理这个问题。这步随机化让快速排序的时间期望成为了O(nlogn),并且只有极低的概率退化为O(n^2)。
面对有大量重复元素的数据时,还是有可能退化成O(n^2)级别的。通过这个思路,我们可以进一步优化,提出三路快排的思想。
3. 三路快排
三路快排的Partition代码是这样的。
// v为pivot,初始存储在arr[l]的位置
int lt = l; // 循环过程中保持 arr[l+1...lt] < v
int gt = r + ; // 循环过程中保持 arr[gt...r] > v
int i = l+; // 循环过程中保持 arr[lt+1...i) == v
while( i < gt ){
if( arr[i] < v ){
swap( arr[i++], arr[lt+]); lt ++; }
else if( arr[i] > v ){
swap( arr[i], arr[gt-]); gt --; }
else // arr[i] == v
i ++;
}
swap( arr[l] , arr[lt] );
// 此时 arr[lt...gt-1]部分为数组中元素等于v的部分
// 之后只需要递归地对arr[l...lt-1]和arr[gt...r]两部分进行三路快排即可
class Solution:
def _sortColors(self, nums, l, r):
if l >= r:
return
# pratition
pivot = nums[l]
j = l+1 #循环过程中保持 arr[lt+1...j) == v
lt = l #循环过程中保持 arr[l+1...lt] < v
gt = r # 循环过程中保持 arr[gt...r] > v
while j <= gt:
if nums[j] < pivot:
nums[lt], nums[j] = nums[j], nums[lt]
j += 1
lt += 1
elif nums[j] > pivot:
nums[gt], nums[j] = nums[j], nums[gt]
gt -= 1
else:
j += 1 #devide
self._sortColors(nums, l, lt-1)
self._sortColors(nums, gt+1, r)
def sortColors(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
self._sortColors(nums, 0, len(nums)-1)
LeetCode 分类颜色的更多相关文章
- LeetCode:颜色分类【75】
LeetCode:颜色分类[75] 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 ...
- [leetcode] 75. 分类颜色(常数空间且只扫描一次算法)
75. 分类颜色 我们直接按难度最高的要求做:你能想出一个仅使用常数空间的一趟扫描算法吗? 常数空间 只能扫描一趟.注意,是一趟,而不是O(n) 题中只会出现3个数字:0,1,2.换句话说,0肯定在最 ...
- LeetCode 75. 颜色分类(Sort Colors) 30
75. 颜色分类 75. Sort Colors 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中, ...
- Leetcode 75.颜色分类 By Python
给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和蓝色. ...
- leetcode 75颜色分类
两趟扫描,由于排序变量的特殊性,使用计数排序方法可以明显降低至O(n)time O(n) space 关于计数排序:https://mp.weixin.qq.com/s/WGqndkwLlzyVOHO ...
- Java实现 LeetCode 75 颜色分类
75. 颜色分类 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红 ...
- LeetCode(75):分类颜色
Medium! 题目描述: 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 ...
- leetcode 75. 颜色分类 JAVA
题目: 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和 ...
- Leetcode 75. 颜色分类
题目链接 https://leetcode-cn.com/problems/sort-colors/description/ 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们 ...
随机推荐
- 通过Callable接口实现多线程
一.通过Callable接口实现多线程 c.实现Callable重写call方法 实现Callable和实现Runnable类似,但是功能更强大,具体表现在 a.可以在任务结束后提供一个返回值,Run ...
- hadoop 中ALL Applications 中Tracking 下History查找不到MapReduce Job 日志
运行一个Map Reduce job 想查看日志: 点击History ,找不到网页 解决办法如下: 1.其中有一个进程是需要启动的: Hadoop自带了一个历史服务器,可以通过历史服务器查看已经运行 ...
- mysql 知识整理
前言 安装 使用 关于mysql程式的linux命令 启动mysqld 检查端口是否运行 查看数据库程式相关信息 查看mysql版本 查看配置文件位置 登陆mysql 修改密码 SQL命令 查看数据库 ...
- 【异常】The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
1 详细异常信息 The last packet sent successfully to the server was milliseconds ago. The driver has not re ...
- Invalid character found in the request target. The valid characters are defined in RFC 7230 and RF
SpringBoot 请求参数包含 [] 特殊符号 返回400状态 //springBoot 启动类 添加 bean @Bean public TomcatServletWebServerFactor ...
- AspectJ注解支持
<aop:aspectj-autoproxy/> 配置aspectj启动 AspectJAutoProxyBeanDefintionParser implements BeanDefini ...
- Ubuntu16.04连接SSH出现 Server responded “Algorithm negotiation failed” 的解决方法
今天安装了Ubuntu16.04虚拟机,与SSH连接时出现了如下问题 解决方法如下: (写在前面:请先确保自己已经给Ubuntu安装了SSH服务.安装方法是在root模式下,终端输入命令apt-g ...
- 运行一次node服务后,再次运行报错
由于工作内容在git上,而系统又是window,大家知道,window自带的终端是不能进行git操作的,所以下载了一个git进行代码的更新提交. 我在git上运行了node服务后,由于不同的项目,我需 ...
- RestTemplate响应值乱码
@Bean public RestTemplate getRestTemplate(){ RestTemplate restTemplate = new RestTemplate(); //解决中文乱 ...
- nodejs基础一
Node.js是一个基于Chrome V8引擎的JavaScript运行. js的运行环境 运行js有两种: .js文件方式 交互(REPL): node 回车进入交互模式 .exit 退出交互模式 ...