《剑指offer》系列 最小的K个数(Java)

版权声明:本博客可任意转载,不用通知 https://blog.csdn.net/hbkzhu13579/article/details/84143495

链接

牛客:最小的K个数

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

思路

我们需要借助一个辅助的函数,就是快排当中的分割(Partition),我们只要找到第k个数,就根据partition找到了对应的k个最小的数。
还有一种方法是建立一个k大小的最大堆 具体参考这篇文章:
寻找数组中最小的k个数(快排和堆排)

代码

import java.util.*;

public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> a = new ArrayList<Integer>();
        int length = input.length;
        if(k > length)
            return a;
        if(k == length){
            for(int i = 0; i < k; i++){
                a.add(input[i]);
			}
            return a;
		}
        int low = 0;
        int high = length - 1;
        int pivot = Partition(input, low, high);
        while(pivot!=k){
            if(pivot<k){
                low = pivot + 1;
                pivot = Partition(input, low, high);
			}
            else{
                high = pivot - 1;
                pivot = Partition(input, low, high);
            }
        }
        for(int i = 0; i < k; i++){
        	a.add(input[i]);
		}
        return a;
    }
    
    
    int Partition(int r[], int i, int j)
	{
		int pivot = r[i];						//选择第一个作为枢纽元
		while (i<j)		
		{
			while (i < j && r[j] >= pivot)		//从后面找第一个小于temp的元素 放到i位置
				j--;
			if (i < j)
				r[i++] = r[j];	
			while (i < j &&r[i] <= pivot)		//从前面找第一个大于temp的元素 放到high位置
				i++;
			if (i < j)
				r[j--] = r[i];					
		}
		r[i] = pivot;							//枢纽元放到i位置
		return i;
	}
}

猜你喜欢

转载自blog.csdn.net/hbkzhu13579/article/details/84143495
今日推荐