NC119 最小的K个数 ( 基于快排的选择算法 )

牛客: NC119 最小的K个数

在这里插入图片描述


题型: 215. 数组中的第K个最大元素 ( 基于快排的选择算法 )

topK 问题

  1. 大顶堆
  2. 基于快排的选择算法 ( 随机值优化时间复杂度 )


AC Code 基于快排的选择算法

import java.util.*;

public class Solution {
    
    
    // 随机值
    Random random = new Random();
    
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
    
    
        int len = input.length;
        // 基于快排的选择算法
        ArrayList<Integer> list = new ArrayList<>();
        if(k > len || k <= 0) return list;
        
        int idx = quickSelect(input, 0, len - 1, k - 1);
        for(int i = 0; i <= idx; i++) list.add(input[i]);
        return list;
    }
    
    // 
    public int quickSelect(int[] arr, int left, int right, int kindex){
    
    
        int idx = randomPartition(arr, left, right);
        if(idx == kindex) return idx;
        else return idx > kindex ? quickSelect(arr, left, idx - 1, kindex) 
                                : quickSelect(arr, idx + 1, right, kindex);
    }
    
    public int randomPartition(int[] arr, int left, int right) {
    
    
        // 生成随机值
        int q = random.nextInt(right - left + 1) + left;
        swap(arr, q, right);
        return partition(arr, left, right);
    }
    
    public int partition(int[] arr, int left, int right){
    
    
        // x 为随机值
        int x = arr[right], i = left;
        
        // 将小的放到左区间
        for(int j = left; j < right; j++) {
    
    
            if(arr[j] <= x) {
    
    
                swap(arr, j, i);
                i++;
            }
        }
        swap(arr, i, right);
        return i;
    }
    
    
    public void swap(int[] arr, int x, int y){
    
    
        int tmp = arr[x];
        arr[x] = arr[y];
        arr[y] = tmp;
    }
    
}



猜你喜欢

转载自blog.csdn.net/qq_43765535/article/details/112976482
今日推荐