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] = 2let 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) > xlet 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; };
