Q8-LeetCode75- 颜色分类

99 阅读1分钟

一 实现思路

1 思维层面

1 关键是要 先想清楚需要维护哪些区间,以及每个区间的性质

2 把数组想象成 已处理区域 和 待处理区域

2 参考实现

01-官方实现

二 代码实现

1 方法1: 三路快排,具体实现略(可见leetCode912), 时间复杂度O(nlogn)

2 方法2: 三路快排partiton 时间复杂度: O(n); 空间复杂度: O(1)

  • 方法1没有利用到 "元素成员值只有 1/2/3"的性质,
  • 通过利用这个性质,可以通过只实现三路快排的partition, 来简化时间复杂度
function sortColors(nums: number[]): void {
  // [0, p0]都等于0;[p0+1, cur)都等于1;[p2, len-1]都等于2
  // [cur, p2) 是 当前待处理的数
  let p0 = -1, p2 = nums.length, cur = 0;
  while (cur < p2) {
    let x = nums[cur];
    if (x === 0) swap(nums, ++p0, cur++);
    if (x === 1) cur++;
    if (x === 2) swap(nums, --p2, cur);
  }
}

function swap(arr, i, j) {
  [arr[i], arr[j]] = [arr[j], arr[i]];
}