LeetCode OJ平台上Sort Colors题目算法探讨

5 篇文章 0 订阅

原题如下,意思就是说无序数组(由0,1,2组成),一遍扫描,把数组整理成若干个0-若干个1-若干个2这样的序列。

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.

click to show follow up.

Follow up:
A rather straight forward solution is a two-pass algorithm using counting sort.
First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.

Could you come up with an one-pass algorithm using only constant space?


想了一段时间,未果,于是前往Discuss区域围观。

帖子网址点击打开链接

网友xianlei给出了一个精妙的方法,我理解之后,写出代码如下,因为有详细的注释,就不啰嗦了。

在草纸上模拟一下,或者单步调试一下,就会明白这个方法的精妙之处!!

public class Solution {
	static int[] A = {1,0};
    public static void sortColors(int[] A) {
    	int i = 0;//last index of array 0
    	int j = 0;//last index of array 1
    	int k = 0;//last index of array 2
    	for(int m = 0; m < A.length; m ++){
    		if(A[m] == 0){ // add 2 to the end of 2 array, replace the 1st 2 with 1, then insert 0 into 0 array, 
    			A[k++] = 2;
    			A[j++] = 1;
    			A[i++] = 0;
    		}
    		else if(A[m] == 1){// add 2 to the end of 2 array, then insert 1, at the location of the 1st 2
    			A[k++] = 2;
    			A[j++] = 1;
    		}
    		else{//add 2 to the end of 2 array
    			A[k++] = 2;
    		}
    	}        
    }
    public static void main(String args[]){
    	sortColors(A);
    }
}


网友lchen77提供了另一个很好的思路,我的实现代码如下。

因为题目要求按照0,1,2的顺序来排序,所以遇到0,与前面的A[k++]交换,遇到2与A[j--]交换。

需要注意的是,A[k]要么等于0,要么等于1,所以0与A[k++]交换之后,i不用--,整个前面的序列是合法的。

但是2与A[j--]交换之后,i要--,因为从数组尾部随便一个数字与当前的2换完之后,必须还要验证,以防不合法。

而且,循环的终止条件是i,j相遇,相遇的时候,还要执行一次,即循环终止条件是i>j

public class Solution {
	public static void sortColors(int[] A){
		int k = 0; //index for 0 array;
		int j = A.length-1;//index for 2 array
		for(int i = 0; i <= j;i ++){
			if(A[i] == 1){
				continue;
			}
			else if(A[i] == 0){
				A[i] = A[k];
				A[k++] = 0;
			}
			else{
				A[i] = A[j];
				A[j--] = 2;
				i --;
			}
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值