30. 剑指offer 最小的k个数

版权声明:转载请标明出处 https://blog.csdn.net/easy_purple/article/details/83175930

题目:

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

思路1:

排序后位于前边的k个数就是最小的数。(快排)

思路2:

创建一个大小为k的数据容器来存储最小的k个数字,如果数组为空或数组的长度小于k,直接返回空;

从输入的n个整数中一个一个读入放入该容器中,如果容器中已有k个数字,而数组中还有值未加入,此时就不能直接插入了,而需要替换容器中的值。按以下步骤进行插入

先找到容器中的最大值;

将待查入值和最大值比较,如果待查入值大于容器中的最大值,则直接舍弃这个待查入值即可;如果待查入值小于容器中的最小值,则用这个待查入值替换掉容器中的最大值;

重复上述步骤,容器中最后就是整个数组的最小k个数字。

代码1:

public static void main(String[] args) {
		int[] a = { 1, 2, 6, 5, 9, 8, 3 };
		sort1(a, 0, a.length - 1);
		for (int i = 0; i < a.length; i++)
			System.out.println(a[i]);

	}

	public static int division(int[] a, int left, int right) {
		int base = a[left];
		while (left < right) {
			while (left < right && a[right] >= base)
				right--;
			a[left] = a[right];
			while (left < right && a[left] <= base)
				left++;
			a[right] = a[left];
		}
		a[left] = base;
		return left;
	}

	public static void sort1(int[] a, int left, int right) {
		if (left >= right)
			return;
		int index = division(a, left, right);
		sort1(a, left, index - 1);
		sort1(a, index + 1, right);
	}

代码2:

public static ArrayList<Integer> find(int[] input, int k) {
		if (input == null)
			return null;
		ArrayList<Integer> list = new ArrayList<Integer>(k);
		if (k > input.length)
			return list;
		TreeSet<Integer> tree = new TreeSet<Integer>();
		for (int i = 0; i < input.length; i++) {
			tree.add(input[i]);
		}
		int i = 0;
		for (Integer elem : tree) {
			if (i >= k)
				break;
			list.add(elem);
			i++;
		}
		return list;
	}

猜你喜欢

转载自blog.csdn.net/easy_purple/article/details/83175930
今日推荐