LeetCode刷题2

今天刷的题是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;
    }
}

 

posted @ 2019-08-05 10:24  刘云生  阅读(145)  评论(0编辑  收藏  举报