97. 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.

问题的本质是数组中只有三个元素,分别是0,1,2.要求是不能用排序的算法把0全部放到最前面,1放到中间,2放到最后。
思路:采用两个指针的思想,下标[0,flag1)之间的元素都是0,下标(flag2,nums.length-1]之间的元素都是2.下标[flag1,i)之间的都是1,只有[i,flag2]之间的元素是乱的。所以初始化时flag1=0,flag2=nums.length-1.
移动的下标为i,循环的条件是i<=flag2, 结束的条件是flag2<i,此时说明已经排好序。
当i遇到0时nums[flag1]与nums[i]互换,然后flag1++.其实这个地方只要i遇到了0,直接把 nums[flag1]置为0,把nums[i]置为1就好了。因为nums[flag1]=1是固定的.
当i遇到2时nums[flag2]与nums[i]互换,flag2--,i--(为了在for循环的时候是会进行i++的操作再次回到i所以先进行一次i--的操作,因为需要再次遍历这个i的值,以防止换回的nums[i]=0).

/**
	 * 问题的本质是数组中只有三个元素,分别是0,1,2.要求是不能用排序的算法把0全部放到最前面,1放到中间,2放到最后。
	 * 思路:采用两个指针的思想,下标[0,flag1)之间的元素都是0,下标(flag2,nums.length-1]之间的元素都是2.
	 * 下标[flag1,i)之间的都是1,只有[i,flag2]之间的元素是乱的。 所以初始化时flag1=0,flag2=nums.length-1.
	 * 移动的下标为i,循环的条件是i<=flag2, 结束的条件是flag2<i,此时说明已经排好序。
	 * 当i遇到0时nums[flag1]与nums[i]互换,然后flag1++.其实这个地方只要i遇到了0,直接把
	 * nums[flag1]置为0,把nums[i]置为1就好了。因为nums[flag1]=1是固定的.
	 * 当i遇到2时nums[flag2]与nums[
	 * i]互换,flag2--,i--(为了在for循环的时候是会进行i++的操作再次回到i所以先进行一次i
	 * --的操作,因为需要再次遍历这个i的值,以防止换回的nums[i]=0).
	 */
	public void sortColors(int[] nums) {
		int len = nums.length;
		int flag1 = 0;// 下标flag1之前的元素都是0
		int flag2 = len - 1;// 下标flag2后面的元素都是2
		int temp;
		/* 指针i开始移动,直到i>flag2 */
		for (int i = 0; i <= flag2; i++) {
			/*
			 * 其实这个地方只要i遇到了0,直接把
			 * nums[flag1]置为0,把nums[i]置为1就好了。因为nums[flag1]=1是固定的
			 */
			if (nums[i] == 0) {//
				temp = nums[flag1];
				nums[flag1] = nums[i];
				nums[i] = temp;
				flag1++;
			}
			/*
			 * 这个地方就只能进行交换,而不可以想nums[i]遇到0的时候直接赋值,因为,nums[flag1]=1是固定的,而nums[flag1
			 * ]=0还是1是不确定的。
			 */
			if (nums[i] == 2) {
				temp = nums[flag2];
				nums[flag2] = nums[i];
				nums[i] = temp;
				flag2--;
				i--;
			}
		}
	}

 

你可能感兴趣的:(97. Sort Colors)