码迷,mamicode.com
首页 > 其他好文 > 详细

寻找第k大树

时间:2020-08-31 13:30:48      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:一个   adjust   hid   方法   元素   img   java   返回   isp   

技术图片

 

 

 方法一:

将整个数组进行排序,可使用快排,时间复杂度O(nlogn),这是一个可行的方法,但是还可以优化

所以代码略,如果想偷懒,使用util包提供的函数,就两行代码,Arrays.sort(a);return a[n-k];

方法二:

分析一下快速排序会发现,每一次排序后都能找到第 i+1(i=j时返回i)大的元素

一下是进行快速排序的一个步骤:

技术图片
 1 private int AdjustArray(int [] a,int l,int r){//快速排序的一个子步骤
 2         int i = l,j = r;
 3         int x = a[l];
 4         while(i < j){
 5             while(i < j && a[j] <= x){
 6                 j--;
 7             }
 8             if(i < j){
 9                 a[i] = a[j];
10                 i++;
11             }
12             while(i < j && a[i] > x){
13                 i++;
14             }
15             if(i < j){
16                 a[j] = a[i];
17                 j--;
18             }
19         }
20         a[i] = x;
21         return i; 
22     }
View Code

分治的代码

技术图片
 1 public int findKth(int[] a, int n, int K) {
 2         // write code here
 3         int left = 0,right = n-1;
 4         int i = -1;
 5         while((i - left) != K - 1){
 6             i = AdjustArray(a,left,right);
 7             if((i - left) == (K - 1)){
 8                 return a[i];
 9             }else if((i - left) < (K - 1)){
10                 K = K - (i - left) - 1;
11                 left = i + 1;
12             }else if((i - left) > (K - 1)){
13                 right = i - 1;
14             }
15         }
16         return -1;
17     }
View Code

代码合体:

技术图片
 1 import java.util.*;
 2 
 3 public class Finder {
 4     private int AdjustArray(int [] a,int l,int r){//快速排序的一个子步骤
 5         int i = l,j = r;
 6         int x = a[l];
 7         while(i < j){
 8             while(i < j && a[j] <= x){
 9                 j--;
10             }
11             if(i < j){
12                 a[i] = a[j];
13                 i++;
14             }
15             while(i < j && a[i] > x){
16                 i++;
17             }
18             if(i < j){
19                 a[j] = a[i];
20                 j--;
21             }
22         }
23         a[i] = x;
24         return i; 
25     }
26     public int findKth(int[] a, int n, int K) {
27         // write code here
28         int left = 0,right = n-1;
29         int i = -1;
30         while((i - left) != K - 1){
31             i = AdjustArray(a,left,right);
32             if((i - left) == (K - 1)){
33                 return a[i];
34             }else if((i - left) < (K - 1)){
35                 K = K - (i - left) - 1;
36                 left = i + 1;
37             }else if((i - left) > (K - 1)){
38                 right = i - 1;
39             }
40         }
41         return -1;
42     }
43 }
View Code

方法二与方法一的区别在于方法二不会对整个数组进行排序,时间复杂度为O(n)!

寻找第k大树

标签:一个   adjust   hid   方法   元素   img   java   返回   isp   

原文地址:https://www.cnblogs.com/yu-xia-zheng-ye/p/13562316.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!