剑指Offer:数组中最小的k个数

思路一:先将数组排序完序后取k个数就完事了,基于复杂度的考虑,先使用堆排序,复杂度为O(n*logn)

思路二:可实现维持一个k个数的大根堆,经过维持过的大根堆,就有了较小的k个数,取出即可。

具体步骤:1.可先从数组中取k个数实现一个大根堆,

                  2.遍历原数组,将大根堆堆顶元素和原数组中剩余的数进行比较,

                     如果此数组中的数小于堆顶元素,将数组的数赋值给大根堆的堆顶元素,再调整堆的顺序,使其恢复为大根堆

                     如果此数组中的数大于堆顶元素,什么也不做。

分析:时间复杂度为O(n*logk)

public static ArrayList GetLeastNumbers_Solution(int[] input, int k) {
		ArrayList list=new ArrayList<>();
		int help[] = new int[k];
		// 形成大根堆
		for (int i = 0; i < k; i++) {//数组中形成0-k的大根堆
			heapInsert(help, input[i], i);
		}
		//将大根堆中的数和数组剩余的数进行比较,调整,维持大根堆,
		for(int j=k;j!=input.length;j++) {
			if(input[j] arr[left] ? left + 1 : left;
			largest = arr[index] > arr[largest] ? index : largest;

			if (largest == index) {
				break;
			}
			swap(arr, index, largest);
			index = largest;
			left = 2 * index + 1;
		}
	}

	public static void swap(int arr[], int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

	public static void main(String[] args) {
		int arr[] = {4,5,1,6,2,7,3,8};
		ArrayList getLeastNumbers_Solution = GetLeastNumbers_Solution(arr,4);
		for (Integer integer : getLeastNumbers_Solution) {
			
			System.out.print(integer+"");
		}
	}

 

你可能感兴趣的:(剑指Offer:数组中最小的k个数)