当前位置: 首页 > news >正文

LeetCode -- Sort Colors

题目描述


Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue.


Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.


Note:
You are not suppose to use the library's sort function for this problem.


其实就是三色旗问题,给3个数字0,1,2,把它们排序好。




解法一:
三次遍历。


思路:
先从左边找2,右边找0,第一次遍历,保证0在2的左边;
从左边找1,右边找0,第二次遍历,保证0在1的左边;
从左边找2,右边找1,第三次遍历,保证1在2的左边。


实现代码:





public class Solution {
    public void SortColors(int[] nums) 
    {		
    	FindAndSwap(nums, 0, 2);
    	FindAndSwap(nums, 0, 1);
    	FindAndSwap(nums, 1, 2);
    }
    	
public void FindAndSwap(int[] nums, int left, int right){
	var i = 0;
	var k = nums.Length - 1;
	while(i < k){
		while(nums[i] != right && i < k){
           i++;
       }
       while(nums[k] != left && k > 0){
           k--;
       }
		if(i < k){
			var t = nums[i];
			nums[i] = nums[k];
			nums[k] = t;
		}
	}
}


}










解法二:
其实本题按区域来理解,只需要遍历一次。


思路:
i,j,k分别表示0,1,2的区域下标
1. 如果j为1,往下走:j++ ;如果j为0,交换nums[i]和nums[j]并i++,j++。第一步是保证0区域在1区域的左边
2. 如果j为2,从右边(k=length-1,k--)开始找,找到不是2的,交换nums[j]和nums[k]并k--,这一步是为了保证2在0与1区域的右边。


实现代码:




public class Solution {
    public void SortColors(int[] nums) 
    {		
        var i = 0;
    	var k = nums.Length - 1;
    	var j = 0;
    	while(j <= k){
    		
    		if(nums[j] == 1){
    			j++;
    		}
    		else if(nums[j] == 0){
    			var t = nums[i];
    			nums[i] = nums[j];
    			nums[j] = t;
    			
    			j++;
    			i++;
    		}
    		else{
    			while(nums[k] == 2 && j < k){
    				k--;
    			}
    			
    			var t = nums[j];
    			nums[j] = nums[k];
    			nums[k] = t;
    			k--;
    		}
    	}
	
    }
    	


}


相关文章:

  • 理解HTTP消息头
  • LeetCode -- Convert SortedList To BST
  • HTTP协议返回状态码表
  • LeetCode -- Insert Interval
  • 推荐WPF的好书
  • LeetCode -- Longest Valid Parentheses
  • 利用Intel博锐技术解决桌面管理难题
  • LeetCode -- Permutations
  • LeetCode -- Construct Binary Tree from Inorder and Postorder Traversal
  • 王小云:十年破译五部顶级密码
  • LeetCode -- Factorial Trailing Zeroes
  • LeetCode -- Gas Station
  • 山东大学王小云教授成功破解MD5
  • LeetCode -- Implement Trie (Prefix Tree)
  • 2009年的3G上网卡市场,华为将会领跑
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Angularjs之国际化
  • create-react-app做的留言板
  • IP路由与转发
  • PHP的Ev教程三(Periodic watcher)
  • PV统计优化设计
  • Solarized Scheme
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 扑朔迷离的属性和特性【彻底弄清】
  • 学习ES6 变量的解构赋值
  • 译自由幺半群
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (0)Nginx 功能特性
  • (13):Silverlight 2 数据与通信之WebRequest
  • (145)光线追踪距离场柔和阴影
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (javascript)再说document.body.scrollTop的使用问题
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十)T检验-第一部分
  • (四)图像的%2线性拉伸
  • (原)Matlab的svmtrain和svmclassify
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)Sql Server 保留几位小数的两种做法
  • .htaccess配置常用技巧
  • .NET : 在VS2008中计算代码度量值
  • .Net Core和.Net Standard直观理解
  • .net MySql
  • .Net Redis的秒杀Dome和异步执行
  • .NET 事件模型教程(二)