package com.leetcode.july;
import java.util.Arrays;
/**
* @author jiayoo
* 7/27
* 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
*
*
*/
public class Demo215 {
/**
* @param nums
* @param k
* 思路: 排序, 反向找。 这个方法没有技巧 太暴力了
* 当然 如果你能自己写个快排 做出来的话 还是有意思的。
* @return
*/
public int findKthLargest(int[] nums, int k) {
int i, len;
int value = 0;
Arrays.sort(nums);
if (k == nums.length) {
return nums[0];
}
len = nums.length -1;
for (i = len; i > 0; i--) {
value = nums[i];
k--;
if (k == 0) {
return value;
}
}
return value;
}
/**
* @param nums
* @param k
* 这个方法 还是有技巧的
* 1.先找到 数组里的 最大最小值
* 2. 创建一个 足以容纳 所有数的数组array
* 3. 将原数组的值 作为 array 数组的下标 , 并且 array 数组记录该值出现的次数
* 4. 通过遍历array 即可 最终返回数组下标
* @return
*/
public int findKthLargest1(int[] nums, int k) {
if (nums.length == 1) {
return nums[0];
}
int max = nums[0];
int min = nums[0];
for (int i : nums) {
if (i > max) {
max = i;
} else if (i < min) {
min = i;
}
}
int[] array = new int[max - min + 1];
for (int i : nums) {
array[max - i]++;
}
int number = 0;
for (int i = 0; i < array.length; i++) {
number += array[i];
if (number >= k) {
return max - i;
}
}
return 0;
}
}