From 5ce70997306fae2443749d30162528afb0260c0e Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 12 May 2018 22:44:19 +0800 Subject: [PATCH] auto commit --- notes/剑指 offer 题解.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 60f122c9..4e0d83d8 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -1776,8 +1776,6 @@ public int MoreThanHalfNum_Solution(int[] nums) { 快速排序的 partition() 方法,会返回一个整数 j 使得 a[l..j-1] 小于等于 a[j],且 a[j+1..h] 大于等于 a[j],此时 a[j] 就是数组的第 j 大元素。可以利用这个特性找出数组的第 K 个元素,这种找第 K 个元素的算法称为快速选择算法。 -找到第 K 个元素之后,就可以再遍历一次数组,所有小于等于该元素的数组元素都是最小的 K 个数。 - ```java public ArrayList GetLeastNumbers_Solution(int[] nums, int k) { ArrayList ret = new ArrayList<>(); @@ -1805,10 +1803,15 @@ public int findKthSmallest(int[] nums, int k) { } private int partition(int[] nums, int l, int h) { - int i = l, j = h + 1; + // 切分元素 + int parti = nums[l]; + // [l + 1, i) (j, h] + int i = l + 1, j = h; while (true) { - while (i < h && nums[++i] < nums[l]) ; - while (j > l && nums[l] < nums[--j]) ; + while (i != h && nums[i] < parti) + i++; + while (j != l && nums[j] > parti) + j--; if (i >= j) break; swap(nums, i, j);