LeetCode_215数组中第K个最大元素

在未排序的数组中找到第 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

说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。


解法1:选择排序

class Solution {
    public int findKthLargest(int[] nums, int k) {
        int length = nums.length;
		int endIndex = k > length / 2 ? (length - k + 1) : k;
		int temp;
		for (int i = 0; i < endIndex; i++) {
			int minIndex = i;
			int maxIndex = length - i - 1;
			for (int j = i; j < length - i; j++) {
				if (nums[j] < nums[minIndex]) {
					minIndex = j;
				}
				if (nums[j] > nums[maxIndex]) {
					maxIndex = j;
				}
			}
			temp = nums[i];
			nums[i] = nums[minIndex];
			nums[minIndex] = temp;
			if (maxIndex == i) {
				maxIndex = minIndex;
			}
			temp = nums[length - i - 1];
			nums[length - i - 1] = nums[maxIndex];
			nums[maxIndex] = temp;
		}
		return nums[length - k];
    }
}

结果:

32 / 32 个通过测试用例
状态:通过
执行用时: 14 ms     19%
内存消耗: 39.2 MB   49%

解法2:冒泡排序

class Solution {
    public int findKthLargest(int[] nums, int k) {
        boolean asc = (nums.length - k + 1) > (nums.length / 2 + nums.length % 2);
		int temp;
		int endIndex = asc ? nums.length - k : k - 1;
		if (asc) {
			for (int i = 0; i < endIndex; i++) {
				boolean flag = false;
				for (int j = 0; j < nums.length - i - 1; j++) {
					if (nums[j] > nums[j + 1]) {
						temp = nums[j + 1];
						nums[j + 1] = nums[j];
						nums[j] = temp;
						flag = true;
					}
				}
				if (!flag) {
					break;
				}
			}
		} else {
			for (int i = 0; i < endIndex; i++) {
				boolean flag = false;
				for (int j = 0; j < nums.length - i - 1; j++) {
					if (nums[j] < nums[j + 1]) {
						temp = nums[j + 1];
						nums[j + 1] = nums[j];
						nums[j] = temp;
						flag = true;
					}
				}
				if (!flag) {
					break;
				}
			}
		}
		return nums[endIndex];
    }
}

结果:

32 / 32 个通过测试用例
状态:通过
执行用时: 211 ms
内存消耗: 39.3 MB

解法3:桶排序

class Solution {
    public int findKthLargest(int[] nums, int k) {
    int maxValue = nums[0];
        int minValue = nums[0];
        for (int num : nums) {
            if (maxValue < num) {
                maxValue = num;
            }
            if (minValue > num) {
                minValue = num;
            }
        }
        int[] result = new int[maxValue - minValue + 1];
        for (int num : nums) {
            result[num - minValue] = result[num - minValue] + 1;
        }
        int total = 0;
        k = nums.length - k + 1;
        for (int i = 0; i < result.length; i++) {
            if (result[i] > 0) {
                total += result[i];
                if (total >= k) {
                    return i + minValue;
                }
            }
        }
        return 0;
    }
}

结果:

32 / 32 个通过测试用例
状态:通过
执行用时: 1 ms       100%
内存消耗: 39.2 MB    57%

解法4:使用HashMap(失败)

class Solution {
    public int findKthLargest(int[] nums, int k) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            int temp = 0;
            Integer value = map.get(num);
            if (value != null) {
                temp = value;
            }
            map.put(num, temp + 1);
        }
        int total = 0;
        k = nums.length - k + 1;
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            total += entry.getValue();
            if (total >= k) {
                return entry.getKey();
            }
        }
        return 0;
    }
}

结果:失败

31 / 32 个通过测试用例

解法5:堆排序(同事完成)
LeetCode_215数组中第K个最大元素_第1张图片
结果:

32 / 32 个通过测试用例
状态:通过
执行用时: 4 ms        
内存消耗: 39.5 MB   

资源:

  1. 常用数据结构+算法
  2. 十大经典排序算法(动图演示)

你可能感兴趣的:(#,LeetCode,数组第k大值,leetcode)