三路快排运用--颜色分类,训练计划

85 阅读2分钟
  1. 颜色分类 已解答 中等 相关标签 相关企业 提示 给定一个包含红色、白色和蓝色、共 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. 其实快排常见的思路就是三路快排,也就是划分为三个区域,随机选取一个基准值,然后划分比它小的区域和比他大的区域。

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
};