Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一.题目介绍
1.题目来源
链接:LeetCode
2.题目
给定一个包含红色、白色和蓝色、共n个元素的数组nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数0、1和2分别表示红色、白色和蓝色。必须在不使用库的sort函数的情况下解决这个问题。
示例 1:
输入:nums = [2,0,2,1,1,0] 输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1] 输出:[0,1,2]
二.具体实现
1.实现思路
通过提示我们可以容易想到头尾各用一个指针,然后一次遍历,遇到红色就与头部置换,遇到蓝色就与尾部置换,其中遇到蓝色时,需要判断尾部之前为红色的场景,此时通过将index减一,可以避免代码添加额外判断。
2.实现代码
1)自己的实现方式
public void sortColors(int[] nums) {
int redIndex = 0;
int blueIndex = nums.length - 1;
for (int index = 0; index <= blueIndex; index++) {
if (nums[index] == 0) {
swap(nums, redIndex, index);
redIndex++;
}
if (nums[index] == 2) {
swap(nums, blueIndex, index);
blueIndex--;
index--;
}
}
}
private void swap(int[] nums, int x, int y) {
int temp = nums[x];
nums[x] = nums[y];
nums[y] = temp;
}
2)题友的实现方式
单指针:对数组进行两次遍历。在第一次遍历中,将数组中所有的00交换到数组的头部。在第二次遍历中,将数组中所有的11交换到头部的00之后。此时,所有的22都出现在数组的尾部,这样就完成了排序。
3.运行结果
三.题后思考
可以看到题目已经有限制使用现有函数sort了,也就是很多时候我们在解题的时候会使用到现有的函数,算是偷懒了,这也是一个提醒,做题的时候一定要把题目审清楚,不然写完了才发现不对。