今天刷的题是LeetCode上215题。该题的要求是给定一个数组,找出数组中第k大的数。
我的方法是首先对数据进行排序,这里选择插入排序。插入排序中,我犯了个错误,就是重新申请了一个数组。然后总是有些问题。后头又认真看啦看插入排序的实现方式。
具体代码如下:
class Solution { public int findKthLargest(int[] nums, int k) { int result; int length=nums.length; if (length==1){ result=nums[0]; }else{ for (int i = 1; i <length ; i++) { int j=i-1; int num=nums[i]; for (; j >=0 ; j--) { if (nums[j]>num){ nums[j+1]=nums[j]; }else { break; } } nums[j+1]=num; } result=nums[length-k]; } return result; } }
经过研究,可以看出这个问题也可以通过快排来实现。
快排的思想是:在未经排序的数组中,选择一个数,将小于这个数的所有数放在左边,大于这个数的所有数放在右边,将这个数放在两个子区间的中间,并返回其坐标p。
因此可以看出,通过比较坐标p和k以及数组长度n三者之间的关系,就可以快速得出dik大的数据。具体地,k>n-p,那么就需要在p的左边继续查找。k=n-p,那么这个数就是第k大的数。k<n-p,那么就需要在右边继续查找。具体地代码如下:
package com.company.sort; /** * @author liuyunsheng * @date 2019/8/7 * @description 从一个未排序数组中找出第k大的数 * 打算使用的方法是:快排 */ public class FindKthNum { public static void main(String[] args) { int [] a={0,1,10,-2,-6,-8,10,11,12,8,9,2,1,11}; int num=FindKthNum.QuickSort(a,0,a.length-1,4); System.out.println(num); } public static int QuickSort(int[] a,int p,int r,int k){ if(p>=r) return a[p]; int q=partition(a,p,r); if (a.length-q==k){ return a[p]; }else if (k<a.length-q){ return QuickSort(a,q+1,r,k); }else { return QuickSort(a,p,q-1,k); } } public static int partition(int[] a,int p,int r){ int pivot=a[r]; int i=p; for (int j = p; j < r ; j++) { if (a[j]<pivot){ int numI=a[i]; a[i]=a[j]; a[j]=numI; i=i+1; } } a[r]=a[i]; a[i]=pivot; return i; } }