786. 第k个数

Problem: 786. 第k个数(acwing)
P1923 【深基9.例4】求第 k 小的数(洛谷)
215. 数组中的第K个最大元素(力扣)

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这个问题要求找出数组中的第k个最大元素。这可以通过使用快速选择算法来实现,该算法是快速排序的一种变体。 快速选择算法的基本思想是,如果我们按照快速排序的方式,将数组划分为两个部分,那么我们就可以知道枢轴的最终位置。如果枢轴的位置恰好为k,那么枢轴就是我们要找的第k个元素。如果k小于枢轴的位置,那么我们就在左侧部分继续查找,否则在右侧部分继续查找。

解题方法

首先,我们随机选择一个枢轴,并将数组划分为两部分,一部分是小于枢轴的元素,另一部分是大于枢轴的元素。
然后,我们比较k和枢轴的位置。如果k小于枢轴的位置,我们就在左侧部分继续查找;如果k大于枢轴的位置,我们就在右侧部分继续查找;如果k等于枢轴的位置,我们就找到了第k个元素,直接返回。
我们重复上述过程,直到找到第k个元素。

复杂度

时间复杂度:

这个问题的时间复杂度是 O ( n ) O(n) O(n),因为我们每次都将问题的规模减半。

空间复杂度:

空间复杂度是 O ( 1 ) O(1) O(1),因为我们只需要常数级别的额外空间。

Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	static StreamTokenizer sr = new StreamTokenizer(in);
	static int MAXN = 100010;
	static int[] arr = new int[MAXN];
	static int n, k;

	public static void main(String[] args) throws IOException {
		n = nextInt();
		k = nextInt();
		for (int i = 0; i < n; i++) {
			arr[i] = nextInt();
		}
		out.println(randomSelect(k));
		out.flush();

	}

	public static int randomSelect(int i) {
		int ans = 0;
		for (int l = 0, r = n; l <= r;) {
			partition(l, r, arr[l + (int) (Math.random() * (r - l + 1))]);
			if (i < first) {
				r = first - 1;
			} else if (i > last) {
				l = last + 1;
			} else {
				ans = arr[i];
				break;
			}
		}
		return ans;
	}

	public static int first, last;

	public static void partition(int l, int r, int x) {
		first = l;
		last = r;
		int i = l;
		while (i <= last) {
			if (arr[i] < x) {
				swap(i++, first++);
			} else if (arr[i] == x) {
				i++;
			} else {
				swap(i, last--);
			}
		}

	}

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

	static int nextInt() throws IOException {
		sr.nextToken();
		return (int) sr.nval;
	}

}

你可能感兴趣的:(刷题,算法,排序算法,算法,leetcode,acwing)