leetcode 75.颜色分类

//20220401
问题描述:
75.颜色分类
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。

备注:解法比较巧妙,在此记录一下

解题思路:

  • 定义三个指针(官网说的是双指针,但是for循环中的i也算一个指针,必须有一个一直前进的指针,否则遇到双指针元素都一样的话就无法进行置换,置换了也无法记录状态),for循环中的i一直前进(速度为1),定义的index1则记录数组从头开始第一个不为零的数,index2则记录倒数第一个不为2的数。
  • 代码如下:
private void solution(int[] nums){
	int index1 = 0;
	int index2 = nums.length-1;
	for(int i = 0;i<=index2;++i){
	//如果i到达了index2则说明整个数组有序了,此时可以跳出循环
		while(i<index2&&nums[i]==2){//保证index2后面的数字全部是2
			swap(nums,i,index2);
			index2--;
		}
		if(nums[i]==0){
		//开始交换1
		swap(nums,i,index1);
		index1++;//index1记录第一个不为0的数字
		}
	}
}

private void swap(int[] nums, int i ,int j){//交换函数
	int temp = nums[i];
	nums[i] = nums[j];
	nums[j] = temp;
}

以上
希望对后来者有所帮助
/抱拳

posted @ 2022-04-01 10:41  醉生梦死_0423  阅读(21)  评论(0编辑  收藏  举报