力扣刷题:颜色分类(java实现)
Posted 谦谦均
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣刷题:颜色分类(java实现)相关的知识,希望对你有一定的参考价值。
题目:给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1]
输出:[0,1,2]
示例 3:
输入:nums = [0]
输出:[0]
示例 4:
输入:nums = [1]
输出:[1]
提示:
n == nums.length
1 <= n <= 300
nums[i] 为 0、1 或 2
进阶:
你可以不使用代码库中的排序函数来解决这道题吗? 你能想出一个仅使用常数空间的一趟扫描算法吗?
相关标签:数组
、双指针
、排序
解析:看完题目后,最简单的思路就是定义一个指针,记录数组开头0
的个数,然后遍历数组,将0
移到数组开头,当所有的0
都放到数组前面后,然后再把1
移到0
后面,接下来看代码:
public void sortColors(int[] nums)
//先把0找出来
int zero = 0;
for (int i = 0; i < nums.length; i++)
//如果当前位置是0但是zero不是当前位置的索引,交换位置
if(zero!=i && nums[i]==0)
int temp = 0;
temp = nums[zero];
nums[zero] = nums[i];
nums[i] = temp;
zero++;
else if(nums[i]==0)//如果当前位置是0并且zero是当前位置的索引,不需要交换位置
zero++;
//找出1
int one = 0;
for (int i = zero; i < nums.length; i++)
//如果当前位置是1但是one不是当前位置的索引,交换位置
if(one+zero!=i&&nums[i]==1)
int temp = nums[zero+one];
nums[zero+one] = nums[i];
nums[i] = temp;
one++;
else if(nums[i]==1)
//如果当前位置是1并且one是当前位置的索引,不需要交换位置
one++;
上诉解法用了两次for
循环,分别把0
和1
移到数组前面,更简单的做法是一次for
循环的时候,如果是0
,就移到数组开头,如果是2
,就移到数组结尾,来看看代码:
public void sortColors(int[] nums)
//左右指针
int left=0,right=nums.length-1;
for (int i = 0; i <= right; i++)
//如果当前元素是0的情况
//当前元素是0,但是索引不是left,这时需要换位置
if(nums[i]==0&&i!=left)
int temp = nums[i];
nums[i] = nums[left];
nums[left] = temp;
left++;
else if(nums[i]==0)
//当前元素是0并且left是当前位置索引,不需要换位置
left++;
//如果当前元素是2
//当前元素是2,并且索引为right的位置刚好也是2,这时指针移位
if(nums[i]==2&&nums[right]==2)
right--;
i--;//这是因为i位置的元素还需要判断是不是0
else if(nums[i]==2)
//当前元素是2,right索引处不是2,直接换位
int temp = nums[i];
nums[i] = nums[right];
nums[right] = temp;
right--;
i--;
当你停下来休息的时候
不要忘记
别人还在奔跑
以上是关于力扣刷题:颜色分类(java实现)的主要内容,如果未能解决你的问题,请参考以下文章