50 개 질문 LeetCode 텐센트의 선택 - K 번째 큰 요소의 배열

음, 항상 작동하는 방법을 이해하는 것입니다 자신 만의 개인 시간 오프의 책을 볼 수 없습니다, 인정해야한다.

K는 번째 한마디에서 가장 큰 요소는 상관없이 배열은 색인을 통해 직접 액세스 할 수 있기 때문에, 당신은, 정렬, 위치를 확인해야 할 때 사용하는 알고리즘, 첫 번째 정렬 없다, 그래서 역순으로 배열을 정렬거야 배열을 찾아 선택 알고리즘의 측면 정렬 힙 큰 가기 힙을 사용하려고 시작하지만, 다음, 빠른 방전 성능이 더 나은 것, 그래서 우리는 빠른에왔다

다음과 같이 구체적인 아이디어가 있습니다 :

  공간의 복잡성을하기 위해 시작은 O (1), 그래서 구덩이를 많이 밟지 때문에, 구덩이 직접, 가장 중립 위치를 찾을뿐만 아니라, 왼쪽 중간보다 작은 요소, 그것은 중간 위치를 이동하려고하지 않습니다 확인하는 것입니다 축소합니다. . . 비참 캉캉.

  집 가까이 :

  1. 우선 재귀를 사용하여 명확 빠른 행입니다

  2. 두 번째 삼위안 선회 판정 방법의 사용, 즉 경계 요소는 왼쪽 선회보다 우측 요동보다 작지만 큰

  3.있어서 재귀 크기 (k)의 어느 쪽을 결정

 

다음과 같이 구체적인 절차는 다음과 같습니다

1 개  패키지 알고리즘;
2  
3  공용  클래스 이것은 QuickSort {
 4  
5      공중  INT findKthLargest ( INT [] nums, INT의 K) {
 (6)          의 경우 (nums.length < K) {
 7               0 ;
8          }
 9          퀵 (nums, 0, nums.length-1 , K);
10  
11          복귀 nums [K-1 ];
12      }
 13  
14      개인  공극 퀵 ( INT [] nums, INT왼쪽 INT 오른쪽 의 INT K) {
 15  
(16)          INT의 중심 = (좌측 + 우측) / 2 ;
17          의 경우 (좌측> = 우측) {
 18              ;
19          }
 20          INT의 피봇 = chosePivot (nums, 좌, 우, 중앙);
(21)  
(22)          의 INT I = 1 + 왼쪽 ;
23          의 INT J = 오른쪽-1 ;
24 일          동안은 (나는 < J)를 {
 25 일              동안 (nums [내가 ++]> = nums [센터] && 난 < 센터) {
 26                  I ++ ;
(27)             }
 28              동안 (nums [j--] <nums [센터] && J> 센터) {
 29                  j-- ;
30              }
 31  
32              경우 (nums [I] <= 피봇 && 피봇 <= nums [J]) {
 33                  스왑 (nums, I, J);
34                  의 경우 (I == 센터) {
 35                      센터 = J;
36                  } 다른  경우 (j == 센터) {
 37                      센터 = I;
38                  }
 39              }
 40         }
 (41)          의 경우 (K <= 센터) {
 42              퀵 (nums, 왼쪽, 가운데, K);
43          } 다른  경우 (K> 센터) {
 44              퀵 (nums 센터 + 1 , 오른쪽, K);
45          }
 46  
47  
48      }
 49  
50      개인  INT chosePivot ( INT [] nums, int입니다 왼쪽 INT 오른쪽 INT의 중심) {
 51          의 경우 (nums [오른쪽]> nums [중심]) {
 52              스왑 (nums, 우측, 센터) ;
53  
(54)          }
 (55)          의 경우 (nums [좌측] < nums [오른쪽]) {
 56              스왑 (nums, 왼쪽, 오른쪽);
57  
(58)          }
 (59)  
(60)          의 경우 (nums [좌측] < nums [중심]) {
 61              스왑 (nums, 왼쪽 센터);
62          }
 63  
64  
65          복귀 nums [중심];
66  
(67)      }
 (68)  
(69)      전용  공간 스왑 ( 값 int [] nums을 하는 int 왼쪽 int로 오른쪽) {
 70          INT의 온도 =nums [좌측];
71          nums [좌측]가 = nums [오른쪽];
72          nums [오른쪽] = 온도를;
73      }
 74      
75      공공  정적  무효 메인 (문자열 []에 args) {
 76          INT [] = nums 새로운  INT [] {3,2,1,5,6,4 };
(77)  
(78)          이것은 QuickSort 정렬 = 새로운 이것은 QuickSort ();
79  
(80)  
81          에서 System.out.println (sort.findKthLargest (nums, 2 ));
(82)          에 대해 ( int로 I : nums)을 {
 83              System.out.print (I);
(84)         }
 85      }
 86  
87  
88 }

 

최적화 문제를 고려하는 것까지가-에 따라, 그래서 첫 공연은

추천

출처www.cnblogs.com/Kaithy-Rookie/p/11305385.html