首页 > 其他分享 >《剑指offer》day17

《剑指offer》day17

时间:2022-10-22 14:22:38浏览次数:79  
标签:arr offer int 复杂度 中位数 day17 public

最小的k个数

题目描述

image

思路

快速排序

注意本题对返回结果的顺序性没有要求,可以根据基准点来提高效率

当基准点==k,直接返回

当基准点>k,往左递归

否则往右递归

代码实现

class Solution {
    int k=0;
    public int[] getLeastNumbers(int[] arr, int k) {
        this.k=k;
        if(arr.length<=k){
            return arr;
        }
        quickSort(arr,0,arr.length-1);
        return Arrays.copyOf(arr,k);
    }
    public void quickSort(int[]arr,int l,int r){
        if(l>=r){
            return;
        }

        int i=l,j=r;
        int tmp=arr[i];
        while(i<j){
            while(i<j&&arr[j]>=arr[l])j--;
            while(i<j&&arr[i]<=arr[l])i++;
            tmp=arr[i];
            arr[i]=arr[j];
            arr[j]=tmp;
        }
        arr[i]=arr[l];
        arr[l]=tmp;
        if(i==k){
            return;
        }else if(i<k){
            quickSort(arr,i+1,r);
        }else{
            quickSort(arr,l,i-1);
        }
    }

}

复杂度分析

时间复杂度

快排平均O(NlogN),最坏O(N^2)

空间复杂度

最坏O(N),整个数组完全逆序的情况

反思不足

思路

没有想到利用数组的无序优化,事出反常必有妖,既然返回结果可以无需,那么便可以成为优化的突破口

java se

Arrays.copyOf(E [] es,int k)可以复制数组的前k个元素

数据流的中位数

题目描述

image

思路

虽然是一道困难题,但是解题思路却是很简单的,排序,然后按要求取数即可,排序我们可以取数时一次性排,也可以在加入时就让其有序

优先队列/堆

我们注意到中位数其实是可以将数据对半分的,因此可以考虑以中位数为堆顶,构建大小根堆,查中位数时返回堆顶元素

显然需要让一个堆的元素在奇数时比另一个多1

代码实现

class MedianFinder {
    Queue<Integer> s,b;
    int cth=0;
    /** initialize your data structure here. */
    public MedianFinder() {
        s=new PriorityQueue<Integer>();
        b=new PriorityQueue<Integer>((x,y)->y-x);
    }
    
    public void addNum(int num) {
        cth++;
        if(cth%2==0){
            s.offer(num);
            b.offer(s.poll());
        }else{
            b.offer(num);
            s.offer(b.poll());
        }
    }
    
    public double findMedian() {
        if(cth%2==0){
            return (s.peek()+b.peek())/2.0;
        }else{
            return s.peek();
        }
    }
}

复杂度分析

时间复杂度

O(logN),堆数据结构的弹出插入操作的时间复杂度,不知道去学数据结构

空间复杂度

O(N)

反思不足

思路

java se

PriorityQueue类是java中的优先队列,默认为小根堆,可以传lambda表达式改为大根堆

标签:arr,offer,int,复杂度,中位数,day17,public
From: https://www.cnblogs.com/zhouj-learn/p/16816028.html

相关文章