master
guangxin.yuan 4 months ago
parent adcef0c89d
commit 73cf06a9d0

@ -1,81 +0,0 @@
public class Solution {
// 找到旋转数组的最小值位置
private static int findMinIndex(int[] nums) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] > nums[right]) {
left = mid + 1;
} else {
right = mid;
}
}
return left; // 最小值的位置
}
// 快速选择算法(类似快速排序的分区操作)
private static int quickSelect(int[] nums, int start, int end, int k) {
if (start == end) {
return nums[start];
}
int pivot = partition(nums, start, end);
if (pivot == k) {
return nums[pivot];
} else if (pivot > k) {
return quickSelect(nums, start, pivot - 1, k);
} else {
return quickSelect(nums, pivot + 1, end, k);
}
}
// 快速排序的分区操作
private static int partition(int[] nums, int start, int end) {
int pivot = nums[end];
int i = start - 1;
for (int j = start; j < end; j++) {
if (nums[j] >= pivot) { // 从大到小排序
i++;
swap(nums, i, j);
}
}
swap(nums, i + 1, end);
return i + 1;
}
// 交换数组中的两个元素
private static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
// 主函数:在旋转数组中找到第 k 大的数字
public static int findKthLargest(int[] nums, int k) {
int minIndex = findMinIndex(nums); // 找到最小值的位置
int n = nums.length;
// 将数组分为两部分,分别查找第 k 大的数字
if (k <= n - minIndex) {
// 第 k 大的数字在后半部分
return quickSelect(nums, minIndex, n - 1, k - 1);
} else {
// 第 k 大的数字在前半部分
return quickSelect(nums, 0, minIndex - 1, k - (n - minIndex) - 1);
}
}
public static void main(String[] args) {
int[] nums = {4, 5, 6, 7, 0, 1, 2};
int k = 3;
int result = findKthLargest(nums, k);
System.out.println("第 " + k + " 大的数字是: " + result);
}
}
Loading…
Cancel
Save