From dbf64f2e028a32df63d085db91bb83d60fb3a570 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 12 May 2018 21:22:36 +0800 Subject: [PATCH] auto commit --- ...214\207 offer \351\242\230\350\247\243.md" | 73 ++++++++++--------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git "a/notes/\345\211\221\346\214\207 offer \351\242\230\350\247\243.md" "b/notes/\345\211\221\346\214\207 offer \351\242\230\350\247\243.md" index dcaca231..60f122c9 100644 --- "a/notes/\345\211\221\346\214\207 offer \351\242\230\350\247\243.md" +++ "b/notes/\345\211\221\346\214\207 offer \351\242\230\350\247\243.md" @@ -1779,46 +1779,49 @@ public int MoreThanHalfNum_Solution(int[] nums) { 找到第 K 个元素之后,就可以再遍历一次数组,所有小于等于该元素的数组元素都是最小的 K 个数。 ```java - public ArrayList GetLeastNumbers_Solution(int[] input, int k) { - ArrayList res = new ArrayList<>(); - if (k > input.length || k <= 0) return res; - findKthSmallest(input, k - 1); - for (int i = 0; i < k; i++) { - res.add(input[i]); - } - return res; - } +public ArrayList GetLeastNumbers_Solution(int[] nums, int k) { + ArrayList ret = new ArrayList<>(); + if (k > nums.length || k <= 0) + return ret; + int kthSmallest = findKthSmallest(nums, k - 1); + // findKthSmallest 会让改变数组,使得前 k 个数都是最小的 k 个数 + for (int i = 0; i < k; i++) + ret.add(nums[i]); + return ret; +} - private void findKthSmallest(int[] nums, int k) { - int l = 0, h = nums.length - 1; - while (l < h) { - int j = paration(nums, l, h); - if (j == k) break; - else if (j > k) h = j - 1; - else l = j + 1; - } +public int findKthSmallest(int[] nums, int k) { + int l = 0, h = nums.length - 1; + while (l < h) { + int j = partition(nums, l, h); + if (j == k) + break; + if (j > k) + h = j - 1; + else + l = j + 1; } + return nums[k]; +} - private int paration(int[] nums, int l, int h) { - //nums[l+1,i] nums[j,h] - int i = l, j = h + 1; - while (true) { - while (i < h && nums[++i] < nums[l]) ; - while (j > l + 1 && nums[--j] > nums[l]) ; - if (i >= j) break; - swap(nums, i, j); - } - swap(nums, l, j); - return j; - - +private int partition(int[] nums, int l, int h) { + int i = l, j = h + 1; + while (true) { + while (i < h && nums[++i] < nums[l]) ; + while (j > l && nums[l] < nums[--j]) ; + if (i >= j) + break; + swap(nums, i, j); } + swap(nums, l, j); + return j; +} - private void swap(int[] nums, int i, int j) { - int t = nums[i]; - nums[i] = nums[j]; - nums[j] = t; - } +private void swap(int[] nums, int i, int j) { + int t = nums[i]; + nums[i] = nums[j]; + nums[j] = t; +} ``` ### 大小为 K 的最小堆 -- GitLab