找出数组中第K个最大的数
2017-08-26 20:39
441 查看
//要求:给定一个无序的int型数组,找出其中第K大的数并输出
/*
思路:
既然是无序,首先就给它排个序,一般就用快排或者堆排序搞定吧。当然也有偷懒的Arrays.sort(arr),但是这就是耍小聪明了。
然后假如是从小到大排序,就逆序遍历数组,若数组元素不重复,直接返回arr[arr.length-K]就可以了,但若考虑到可能有重复的情况,那就需要在遍历过程判断前一个数跟当前的数是否相同,相同的话继续往前走,直到碰到不一样的数才算是从第N大的数到了第N+1大的数。
**/
/*
思路:
既然是无序,首先就给它排个序,一般就用快排或者堆排序搞定吧。当然也有偷懒的Arrays.sort(arr),但是这就是耍小聪明了。
然后假如是从小到大排序,就逆序遍历数组,若数组元素不重复,直接返回arr[arr.length-K]就可以了,但若考虑到可能有重复的情况,那就需要在遍历过程判断前一个数跟当前的数是否相同,相同的话继续往前走,直到碰到不一样的数才算是从第N大的数到了第N+1大的数。
**/
import java.util.Arrays; import java.util.Scanner; /** * @author Tom Qian * @email tomqianmaple@outlook.com * @github https://github.com/bluemapleman * @date 2017年8月26日 */ public class ShanBao { public static int kBiggest(int[] array,int K) { quickSort(array,0,array.length-1); int count=1; for(int i=array.length-1;i>0;i--){ if(count==K) return array[i]; if(array[i-1]!=array[i]){ count++; } } return array[0]; // Arrays.sort(array); // return array[array.length - K]; } public static void quickSort(int[] arr,int start,int end){ if(start>=end) return; boolean leftFlag=false,rightFlag=false; int pivot=start; while(!(leftFlag && rightFlag)){ leftFlag=true;rightFlag=true; //第一轮:第一个元素从右边开始找第一个比它小的元素,与之交换位置 for(int i=end;i>pivot;i--){ if(arr[pivot]>arr[i]){ exchange(arr, pivot, i); pivot=i; rightFlag=false; } } for(int i=start;i<pivot;i++){ if(arr[pivot]<arr[i]){ exchange(arr, pivot, i); pivot=i; leftFlag=false; } } } quickSort(arr, start, pivot-1); quickSort(arr, pivot+1,end); } public static void exchange(int[] arr,int x,int y){ int temp=arr[x]; arr[x]=arr[y]; arr[y]=temp; } public static void main(String[] args) { // Scanner scan=new Scanner(System.in); // String[] strArr=scan.nextLine().split(" "); // int[] arr=new int[strArr.length]; // for(int i=0;i<arr.length;i++) // arr[i]=Integer.parseInt(strArr[i]); // int K=scan.nextInt(); int arr[]={4,2,6,7,7,8,2,1,1,0}; int K=8; System.out.println(kBiggest(arr, K)); } public static void outputArr(int[] arr){ for(int i=0;i<arr.length;i++) System.out.print(arr[i]+" "); } }
相关文章推荐
- 一个数组的值先从小到大递增后从大到小递减,找出最大的值 .
- 找出一个整型数组中的元素的最大值
- 用递规与分治策略,找出数组中最大元素的位置
- Java-找出数组里的最大值和最小值
- 找出数组中依序的最大差值方法(非动态规划版)
- 找出一个数组里面前K个最大数
- php和js中数组中分别循环找出最大的数。
- 找出一个数组中子数组和的最大值
- 20.找出矩阵中最大的数存入数组中
- 同时找出数组的最大值和最小值
- 53. Maximum Subarray(找出最大子数组)
- 电子科技大学推免复试题:利用递归方法找出一个数组中的最大值和最小值
- 算法-数组:找出符合某条件的最大矩形区域
- java找出一个数组中出现次数最多且最大的那个元素
- 在一个有8个整数(18,25,7,36,13,2,89,63)的数组中找出其中最大的数及其下标。
- 在一个n个数的数组中(n很大),找出前i个中的最大或最少的数
- 典型的Top K算法_找出一个数组里面前K个最大数
- java__for找出数组中最大,最小值
- 数组进阶找出最大或最小值
- 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1},