首页 > 其他分享 >剑指offer——Day17 排序(中等)

剑指offer——Day17 排序(中等)

时间:2023-02-01 13:58:01浏览次数:39  
标签:num offer res 元素 Day17 double MedianFinder 排序 size

Day17 2023.2.1 排序(中等)

40. 最小的k个数

自己实现

直接用了排序的函数,这个没啥好说的

代码表现

没有进行优化,中规中矩

41. 数据流中的中位数

自己实现

自己尝试用了最朴素的排序算法,但是超过了时间限制

代码如下:

class MedianFinder {
    vector<int> res;
public:
    /** initialize your data structure here. */
    MedianFinder() {

    }
    
    void addNum(int num) {
        res.push_back(num);
    }
    
    double findMedian() {
        sort(res.begin(),res.end());
        int len=res.size();
        int mid=len/2;
        if(len%2==1){
            return (double)res[mid];
        }
        else{
            int sum=res[mid]+res[mid-1];
            return (double)sum/2.0;
        }
    }
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder* obj = new MedianFinder();
 * obj->addNum(num);
 * double param_2 = obj->findMedian();
 */

题解

通过能很好地优化时间复杂度

建立一个 小顶堆 A 和 大顶堆 B ,各保存列表的一半元素,且规定:

  • A 保存 较大 的一半,长度为 N/2( N 为偶数)或 (N+1)/2( N 为奇数);
  • B 保存 较小 的一半,长度为 N/2( N 为偶数)或 (N-1)/2( N 为奇数);

随后,中位数可仅根据 A,BA, BA,B 的堆顶元素计算得到。

设元素总数为 N=m+n ,其中 m 和 n 分别为 A 和 B 中的元素个数。

addNum(num)函数:

  1. 当 m=n(即 N 为 偶数):需向 A 添加一个元素。实现方法:将新元素 num 插入至 B ,再将 B 堆顶元素插入至 A ;
  2. 当 m≠n(即 N 为 奇数):需向 B 添加一个元素。实现方法:将新元素 num 插入至 A ,再将 A 堆顶元素插入至 B ;

findMedian()函数

  1. 当 m=n( N 为 偶数):则中位数为 (A 的堆顶元素 + B 的堆顶元素 )/2。
  2. 当 m≠n( N 为 奇数):则中位数为 A 的堆顶元素。

(由于这里面用到的堆在C++不太好实现,因此直接用Java体现思路)

代码如下:

class MedianFinder {
    Queue<Integer> A, B;
    public MedianFinder() {
        A = new PriorityQueue<>(); // 小顶堆,保存较大的一半
        B = new PriorityQueue<>((x, y) -> (y - x)); // 大顶堆,保存较小的一半
    }

    public void addNum(int num) {
        if(A.size() != B.size()) {
            A.add(num);
            B.add(A.poll());
        } else {
            B.add(num);
            A.add(B.poll());
        }
    }

    public double findMedian() {
        return A.size()!=B.size() ? A.peek() : (A.peek()+B.peek())/2.0;
    }
}

代码表现

标签:num,offer,res,元素,Day17,double,MedianFinder,排序,size
From: https://www.cnblogs.com/cspzyy/p/17082294.html

相关文章

  • 【八大数据排序法】选择排序法的图形理解和案例实现 | C++
    第十五章选择排序法:::hljs-center目录第十五章选择排序法●前言●认识排序●一、选择排序法是什么?1.简要介绍2.图形理解3.算法分析●二、案例实现1.......
  • (转)Golang sort包排序(详细全集)
    原文:https://blog.csdn.net/qq_43279457/article/details/121730095一、整型首先用下里面提供的最简单的例子,排序一下整形packagemainimport( "fmt" "sort")funcmai......
  • aijs 对象排序
    1.字典对象functiondictGetValue(value){for(dictGetValueIndexinvalue)returnvalue[dictGetValueIndex]}functiondictGetKey(value){for(dictGetKeyInd......
  • java 排序
    ......
  • 希尔排序
    希尔排序希尔排序是希尔(DonaldShell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。希尔排......
  • 排序看这一篇就够了
    排序看这一篇就够了文章目录一、​​冒泡排序​​二、选择排序三、插入排序四、希尔排序五、快速排序六、归并排序七、基数排序/桶排序稳定:如果a原本在b前面,而a=......
  • 排序算法之插入排序
    思路:将数组的第一个元素作为有序数组,其余的作为无序数组,从无序数组中取一个跟有序数组比较,将其放在合适的位置。那么有序数组就有两个元素,无序数组就减少一个元素。 ......
  • 多种数组排序方法
    1.随机生成数据vara=(function(){vara=[];functionrandomInt(from,to){returnparseInt(Math.random()*(to-from+1)+from);}for......
  • day17
    1、leetcode110平衡二叉树平衡二叉树:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。递归法明确递归函数的参数和返回值参数:当前传入节点。返回值......
  • 博客一号 快速排序
    从零开始的算法之路——基础算法之快速排序有了sort函数为什么还要学习其他的排序,的确也看起来比较多余(就目前来看我做的排序题都能用sort解决),但是里面算法中的思想才是......