中级农民
- 积分
- 104
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-4-27
- 最后登录
- 1970-1-1
|
写了最后一题2K WINDOW的代码
- public class QuickSelect {
- public static List<Integer> topK(int[] nums, int k) {
- List<Integer> result = new ArrayList<Integer>();
- if (nums == null || nums.length < k) return result;
- int n = nums.length;
- int i = 0;
- for ( ; i < k; i++) result.add(nums[i]);
- while (i < n) {
- int j = 0;
- for (; j < k && i + j < n; j++) {
- result.add(nums[i + j]);
- }
- quickSelect(result, k);
- i += j;
- }
- return result;
- }
-
- private static void quickSelect(List<Integer> list, int k) {
- selectHelper(list, 0, list.size() - 1, k);
- List<Integer> rest = new ArrayList<Integer>();
- for (int i = k; i < list.size(); i++) rest.add(list.get(i));
- list.removeAll(rest);
- }
-
- private static void selectHelper(List<Integer> list, int start, int end, int k) {
- int randomIndex = start + (int)(Math.random() * (end - start + 1));
- swap(list, end, randomIndex);
- int i = start - 1, j = start, pivot = list.get(end);
- while (j < end) {
- if (list.get(j) >= pivot) {
- swap(list, ++i, j);
- }
- j++;
- }
- swap(list, ++i, end);
- int leftSize = i - start + 1;
- if (leftSize == k) return;
- if (leftSize < k) selectHelper(list, i + 1, end, k - leftSize);
- else selectHelper(list, start, i - 1, k);
- }
-
- private static void swap(List<Integer> list, int i, int j) {
- int temp = list.get(i);
- list.set(i, list.get(j));
- list.set(j, temp);
- }
-
- public static void main(String[] args) {
- int[] nums = {9,0,3,2,8,1,2,3,4,5,6,7};
- List<Integer> list = topK(nums, 3);
- for (int d : list) {
- System.out.print(d + " ");
- }
- System.out.println();
-
- }
- }
复制代码 |
|