• 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;
        }
    }
  • 相关阅读:
    不能交易的物料不可做接收
    限制车间备料方式更改
    成本维护不允许超过设定比例
    车间不可操作非车间仓
    手工成本维护不可以将成本改为零
    手工成本维护超过1500元提醒
    成本查询
    同一供应商只能有一个有效的报价单
    新增报价单状态为有效状态
    同一供应商同一物料存在有效报价时不能再新增报价
  • 原文地址:https://www.cnblogs.com/cquer-xjtuer-lys/p/11301457.html
Copyright © 2020-2023  润新知