LeetCode - 75. Sort Colors
来源:互联网 发布:cr2怎么转换成jpg mac 编辑:程序博客网 时间:2024/05/21 09:24
第一种方法是基于计数排序的算法,需要对数组进行两遍的扫描,第一遍统计红,白和蓝的数目,第二遍生成新的数组。这种方法可以进行扩展,对于数组中数字范围已知的情况,都可以使用这种算法。时间复杂度为O(n),代码如下:
public class Solution{ public void sortColors(int[] nums){ int r = 0; int w = 0; int b = 0; for(int i = 0; i < nums.length; i++){ if(nums[i] == 0) r++; else if(nums[i] == 1) w++; else b++; } for(int i = 0; i < nums.length; i++){ if(i < r) nums[i] = 0; else if(i < r + w) nums[i] = 1; else nums[i] = 2; } }}
第二种方法并不是很general,特别地对于这道题目适用。这种方法只对数组扫描一次,使用两个指针,分别指向red的最后一个元素和blue最前面的一个元素,i从0到第一个blue index进行扫描,如果遇到了0,那么将nums[i]放在red index的位置,从左侧开始red index++;如果遇到了2,那么将nums[i]放在blue index的位置,从右侧开始,也就是n - blueIndex - 1的位置;如果遇到的是1,那么直接i++。时间复杂度为O(n),代码如下:
public class Solution{ public void swap(int[] nums, int a, int b){ int temp = nums[a]; nums[a] = nums[b]; nums[b] = temp; } public void sortColors(int[] nums){ int n = nums.length; int r = 0; int b = 0; for(int i = 0; i < n - b; i++){ // Red if(nums[i] == 0){ swap(nums, i, r); r++; // Blue }else if(nums[i] == 2){ swap(nums, i, n - 1 - b); b++; i--; } } }}
知识点:
1. 注意计数排序算法的思想,使用和空间时间复杂度(均为O(n + k))
2. 注意计数排序在k = 3的时候使用两个指针的one-pass方法
0 0
- [LeetCode]75.Sort Colors
- LeetCode --- 75. Sort Colors
- [Leetcode] 75. Sort Colors
- [leetcode] 75.Sort Colors
- 【leetcode】75. Sort Colors
- [leetcode] 75. Sort Colors
- Leetcode 75. Sort Colors
- *LeetCode 75. Sort Colors
- 75. Sort Colors LeetCode
- Leetcode 75. Sort Colors
- [LeetCode]75. Sort Colors
- LeetCode 75. Sort Colors
- LeetCode *** 75. Sort Colors
- leetcode 75. Sort Colors
- LeetCode 75. Sort Colors
- leetcode-75. Sort Colors
- [leetcode]75. Sort Colors
- LeetCode-75.Sort Colors
- Aggregating local descriptors into a compact image representation(阅读)
- I2C子系统驱动架构 - 具体实现
- struts2环境搭建
- 脚本化文档(2)
- [乱搞] BZOJ 1484 [HNOI2009]通往城堡之路
- LeetCode - 75. Sort Colors
- Nginx核心配置深入理解及优化
- Spring注解@Component、@Repository、@Service、@Controller区别
- linux下查找某个文件位置的方法
- CSS3 timing-function: steps() 详解
- codeforces_679B. Bear and Tower of Cubes(贪心+二分+dfs)
- [仙人掌DP] BZOJ 4316 小C的独立集
- Linux里如何查找文件内容
- 1014. Waiting in Line (30)