75. 颜色分类
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var sortColors = function(nums) {
// [0, p1) = 0
// [p1, p2) = 1
// [p2, len-1] = 2
let p1 = -1;
let p2 = nums.length;
let i = 0;
const swap = (a, b) => [nums[a], nums[b]] = [nums[b], nums[a]];
while ( i < p2) {
if (nums[i] === 0) {
++p1;
swap(i, p1);
i++;
} else if (nums[i] === 1) {
i++;
} else if (nums[i] === 2) {
--p2;
swap(i, p2);
}
}
};
剑指 Offer II 076. 数组中的第 k 大的数字
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findKthLargest = function(nums, k) {
const swap = (l, r) => [nums[l], nums[r]] = [nums[r], nums[l]];
const comparator = (a, b) => {
return a > b;
};
const partition = (l, r, k) => {
// [l, i) < x
// i = x
// (i, r) > x
let x = nums[r-1], i = l, j = l;
while (j < r-1) {
if (comparator(nums[j], x)) {
swap(i, j);
i++;
}
j++;
}
swap(i, r-1);
return i;
};
const getK = (left, right, k) => {
while (true) {
let nextLeft = partition(left, right, k);
let len = nextLeft - left + 1;
if (k === len) {
return nums[nextLeft];
} else if (k < len) {
right = nextLeft;
} else if (k > len) {
left = nextLeft + 1;
k -= len;
}
}
}
return getK(0, nums.length, k);
};
719. 找出第 k 小的距离对
难度困难189收藏分享切换为英文接收动态反馈
给定一个整数数组,返回所有数对之间的第 k 个最小距离。一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值。
示例 1:
输入:
nums = [1,3,1]
k = 1
输出:0
解释:
所有数对如下:
(1,3) -> 2
(1,1) -> 0
(3,1) -> 2
因此第 1 个最小距离的数对是 (1,1),它们之间的距离为 0。
提示:
2 <= len(nums) <= 10000
.0 <= nums[i] < 1000000
.1 <= k <= len(nums) * (len(nums) - 1) / 2
./** * @param {number[]} nums * @param {number} k * @return {number} */ var smallestDistancePair = function(nums, k) { nums.sort((a, b) => a-b); let left = 0, right = nums[nums.length - 1] - nums[0]; while (left < right) { let mid = (left + right) >>> 1; // 满足单调性后,找距离不高于mid的距离对数目。 let count = 0, i = 0; for (let j = 0; j < nums.length; j++) { while (nums[j] - nums[i] > mid) { i++; } count += j - i; } if (count < k) { left = mid + 1; } else { right = mid; } } return left; };