75. 颜色分类

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

注意:
不能使用代码库中的排序函数来解决这道题。

示例:

输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]

第一个思路

它是两次循环

第一次循环 吧所有0 1 2的所有元素都统计出来

第二次 依次循环出 0 1 2的全部元素

时间复杂度O(n)

空间复杂度O(k),k为范围的元素

package com.binglian.array;

public class LK_75 {
	
	
	//循环两次
	//第一次是把所有的都统计出了0 1 2所有的个数
	//第二次 先把0所有循环出来 1一样 2依次
	public void sortColors(int[] nums) {
		
		int[] count={0,0,0};//存放0,1,2三个元素
		for(int i=0;i<nums.length;i++){
			assert nums[i] >=0 && nums[i] <=2;
			count[nums[i]]++;
		}
		
		int index=0;
		for(int i=0;i<count[0];i++){
			nums[index++]=0;
		}
		for(int i=0;i<count[1];i++){
			nums[index++]=1;
		}
		for(int i=0;i<count[2];i++){
			nums[index++]=2;
		}
	}
	
	public static void printArr(int[] nums){
		for(int num:nums)
			System.out.print(num+" ");
		System.out.println();
	}
	
	public static void main(String[]  args){
		int[] nums={2,2,2,1,1,0};
	
		(new LK_75()).sortColors(nums);
		printArr(nums);
	}
}

第二个思路

三排 快排的思路

三种情况

这里就是 0 1 2三种情况

i的位置出现的位置和two进行交换位置 two--

如果出现0 一样的 zero++

 

 

package com.binglian.array;


public class LK_75 {
	
	

	public void sortColors(int[] nums) {
		int zero=-1;			//[0...zero]==0
		int two=nums.length;	//[two...n-1]==2
		for(int i=0;i<two;){
			if(nums[i]==1)
				i++;
			else if(nums[i]==2)
				swap(nums,i,--two);
			else {//nums[i]==0
				assert nums[i]==0;
				swap(nums,++zero,i++);
			}
		}
	}
	
	private void swap(int[] nums, int i, int j){
        int t = nums[i];
        nums[i]= nums[j];
        nums[j] = t;
    }

    public static void printArr(int[] nums){
        for(int num: nums)
            System.out.print(num + " ");
        System.out.println();
    }

    public static void main(String[] args) {

        int[] nums = {2, 2, 2, 1, 1, 0};
        (new LK_75()).sortColors(nums);
        printArr(nums);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值