- 颜色分类 已解答 中等 相关标签 相关企业 提示 给定一个包含红色、白色和蓝色、共 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]
分析思路
- 其实快排常见的思路就是三路快排,也就是划分为三个区域,随机选取一个基准值,然后划分比它小的区域和比他大的区域。
function quick(arr) {
let left = []
let right = []
let mid = arr[0]//这里有问题就是,我是每次都把头元素做为这个基准值,然后
for (let i = 0; i < arr.length; i++) {
if (arr[i] > arr[mid]) {
left.push(arr[i])
} else { right.push.arr[i] }
}
return [...quick(left), mid, ...quick(right)]//由于你一次没有办法把这个,数组进行排序完毕,需要继续递归的将这个数组,继续遍历。
}
所以这个题目化归一下就是通过模拟三路快排对数组进行排序。只不过为了优化要用双指针。
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var sortColors = function (nums) {
let left = 0;
let right = nums.length - 1;
// 这里不能用nums.le
for (let i = 0; i <= right; i++) {
if (nums[i] === 0) {
[nums[i], nums[left]] = [nums[left], nums[i]]
left++
} else if (nums[i] === 2) {
[nums[right], nums[i]] = [nums[i], nums[right]]
right--;
i--
}
}
return nums
};
类似题目 LCR 139. 训练计划 I
教练使用整数数组 actions 记录一系列核心肌群训练项目编号。为增强训练趣味性,需要将所有奇数编号训练项目调整至偶数编号训练项目之前。请将调整后的训练项目编号以 数组 形式返回。
示例 1:
教练使用整数数组 `actions` 记录一系列核心肌群训练项目编号。为增强训练趣味性,需要将所有奇数编号训练项目调整至偶数编号训练项目之前。请将调整后的训练项目编号以 **数组** 形式返回。
输入: actions = [1,2,3,4,5]
输出: [1,3,5,2,4]
解释: 为正确答案之一
/**
* @param {number[]} actions
* @return {number[]}
*/
var trainingPlan = function(actions) {
let left = 0;
let right = actions.length-1;
const judge = (i)=>{
return actions[i] % 2 === 0
}
while(left<=right){
if(!judge(left)){
left ++
continue
}else if(judge(right)){
right--
continue
}
[actions[left],actions[right]] = [actions[right],actions[left]]
left++;
right--
}
return actions
};