最小的k个数&寻找第K大

目录

最小的k个数

题目描述

解法

寻找第K大的数

题目描述

解法


题目1. 最小的k个数

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

解法

  1. 默写快排
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if( k<=0 ||k> input.length ) return res;
        int lo = 0, hi = input.length-1;
        sort(input,lo,hi);
        for(int i = 0; i<k; i++)
            res.add(input[i]);
        return res;
    }
    private static void sort(int [] input, int lo, int hi){
        if(hi<=lo) return;
        int pat = partition(input, lo, hi);
        sort(input,lo, pat-1);
        sort(input,pat+1, hi);
    }
    private static int partition(int [] input, int lo, int hi){
        int v = input[lo];
        int i = lo, j = hi+1;
        while(i<=hi&&j>=0){
            while(input[++i]<v) 
                if(i == hi) break;
            while(input[--j]>v) 
                if(j == lo) break;
            if(i>=j) break;
            int temp = input[i];
            input[i] = input[j];
            input[j] = temp;
        }
        int temp = input[lo];
        input[lo] = input[j];
        input[j] = temp;
        return j;
    }
}

2. 在快排的基础上减小时间复杂度

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if( k<=0 ||k> input.length ) return res;
        int lo = 0, hi = input.length-1;
        sortKsmall(input,k);
        for(int i = 0; i<k; i++)
            res.add(input[i]);
        return res;
    }
    private static void sortKsmall(int [] input, int k){
        int lo = 0, hi = input.length-1;
        while(hi>lo){
           int pat = partition(input, lo, hi);
           if(pat == k) break;
           if(pat>k) hi = pat-1;
           else lo = pat+1;
        }
    }
    private static int partition(int [] input, int lo, int hi){
        int v = input[lo];
        int i = lo, j = hi+1;
        while(i<=hi&&j>=0){
            while(input[++i]<v) 
                if(i == hi) break;
            while(input[--j]>v) 
                if(j == lo) break;
            if(i>=j) break;
            int temp = input[i];
            input[i] = input[j];
            input[j] = temp;
        }
        int temp = input[lo];
        input[lo] = input[j];
        input[j] = temp;
        return j;
    }
}

利用了partition(),partition()的作用是把数组分成两拨,左边的小于input[lo],右边的大于input[lo]。但是这两拨没有被排序。

题目2. 寻找第K大的数

题目描述

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。

给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

解法

第K大也就是从小到大排序的倒数第K个数字。即寻找排序后索引为N-K的数字。

故这道题目直接转化成了求最小的前N-K个数。

import java.util.*;

public class Solution {
    public static void exch(int[] a, int lo, int hi){
        int temp = a[lo];
        a[lo] = a[hi];
        a[hi] = temp;
    }
    public static int partition(int[] a, int lo, int hi){
        int v = a[lo];
        int i = lo;
        int j = hi+1;
        while(i<j){
            while(a[++i]<v) {
                if(i == hi) break;
                
            }
            while(a[--j]>v) {
                if(j == lo) break;                
            }
            if(i>=j) break;
            exch(a,i,j);
        }
        exch(a,lo,j);
        return j;
    }
    //从小到大排序的前k位
    private static void sortKsmall(int [] input, int k){
        int lo = 0, hi = input.length-1;
        while(hi>lo){
           int pat = partition(input, lo, hi);
           if(pat == k) break;
           if(pat>k) hi = pat-1;
           else lo = pat+1;
        }
    }
    public int findKth(int[] a, int n, int K) {
        // write code here
        int t = 0;
        int lo = 0;
        int hi = n-1;
        sortKsmall(a,n-K);  //第K大也就是正数索引位于n-K的元素
        return a[n-K];
        
    }
}

 

购物商城项目采用PHP+mysql有以及html+css jq以及layer.js datatables bootstorap等插件等开发,采用了MVC模式,建立一个完善的电商系统,通过不同用户的不同需求,进行相应的调配和处理,提高对购买用户进行配置….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值