「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」
看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起!
题目
给定一个包含红色、白色和蓝色、共 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]
提示:
n == nums.length1 <= n <= 300nums[i]为0、1或2
暴力解
因为sort被ban了,这次我们换一种暴力解的思路。
- 先找出所有对应数字的个数
- 按照个数依次写回原数组
var sortColors = function(nums) {
const arr = [0,0,0] // 统计 0 1 2分别出现的次数
for(let num of nums){
arr[num]++
}
let index = 0 // 用来标记数组下标
for(let i = 0;i<arr.length;i++) {
while(arr[i]){
nums[index]= i // 向数组中依次写回对应次数的 0 1 2
arr[i]--
index++
}
}
return nums
};
解题思路
- 我们定义
2个指针,一个用来记录0的索引,另一个用来记录2 - 进行左右互换,碰到
0就向左移动,碰到2就向右移动
解题代码
var sortColors = function(nums) {
let p0 = 0 // 初始化 0 表示该索引左边全是0
let p2 = nums.length-1 // 初始化 2 表示该索引左边全是2
for(let i = p0;i<=p2;i++){ 在 p0 - p2 的区间内遍历 nums
if(nums[i]==0){ // 遇到0 交换到左边
[nums[p0],nums[i]] = [nums[i],nums[p0]]
p0++
}else if(nums[i]==2){// 遇到0 交换到右边
[nums[p2],nums[i]] = [nums[i],nums[p2]]
p2--
i-- // 方便二次校验是否交换到一个2
}
}
return nums
};
满身的泥泞和风霜,都没抖落他眼里光和对爱的向往。
如有任何问题或建议,欢迎留言讨论!