题目

image.png

题解

使用快速选择算法

代码

  1. /**
  2. * @param {number[]} nums
  3. * @param {number} k
  4. * @return {number}
  5. */
  6. var findKthLargest = function(nums, k) {
  7. let targetIndex = nums.length - k ;
  8. let l = 0;
  9. let r = nums.length - 1;
  10. while(l < r) {
  11. // 拿到快速排序函数返回当前的索引值,
  12. // 判断该索引在目标值的那一边
  13. let mid = quickSelect(nums, l, r);
  14. if(mid == targetIndex) {
  15. return nums[mid];
  16. } else if (mid < targetIndex) {
  17. l = mid + 1;
  18. } else {
  19. r = mid - 1;
  20. }
  21. }
  22. return nums[l]
  23. };
  24. function quickSelect(nums, l, r) {
  25. let left = l;
  26. let right = r;
  27. let pivot = nums[l];
  28. while(left < right) {
  29. // 当右值大于比较值
  30. while(left < right && nums[right] >= pivot) {
  31. right --;
  32. }
  33. // 右值小与比较值
  34. nums[left] = nums[right];
  35. // 当左值小与比较值
  36. while( left < right && nums[left] <= pivot) {
  37. left++;
  38. }
  39. // 当左值大于比较值
  40. nums[right] = nums[left];
  41. }
  42. // 将比较值放到中间位置
  43. nums[left] = pivot;
  44. // 将其索引返回
  45. return left;
  46. }