Fork me on GitHub

ARTS07

Algorithms-Review-Tip-Share

Posted by Kaelzhang on October 21, 2018

Algorithm

703. 数据流中的第K大元素

设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。

你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。

示例:

int k = 3;
int[] arr = [4,5,8,2];
KthLargest kthLargest = new KthLargest(3, arr);
kthLargest.add(3);   // returns 4
kthLargest.add(5);   // returns 5
kthLargest.add(10);  // returns 5
kthLargest.add(9);   // returns 8
kthLargest.add(4);   // returns 8

说明: 你可以假设 nums 的长度≥ k-1 且k ≥ 1。

解决方案:

我的解法:

class KthLargest {

    public KthLargest(int k, int[] nums) {
        maxSize = k;
        minHeap = new PriorityQueue<>(maxSize);
        for (int num: nums) {
            add(num);
        }
    }

    public int add(int val) {
        int size = minHeap.size();
        if (minHeap.size() < maxSize)
        {
            minHeap.add(val);

        }
        else if (val > minHeap.peek()) {
                minHeap.poll();
                minHeap.add(val);
        }
        return minHeap.peek();
    }

    private PriorityQueue<Integer> minHeap;
    private int maxSize;
}

/**
 * Your KthLargest object will be instantiated and called as such:
 * KthLargest obj = new KthLargest(k, nums);
 * int param_1 = obj.add(val);
 */

更高效解法:

Review

抽象分支是一种用于逐步对软件系统进行大规模更改的技术,允许在变更发生期间仍然能够定期发布系统。

下面是这个系统的示例,我们需要对该系统进行更新。

首先需要创建一个抽象层,用于捕获客户端代码和系统之间的交互。令部分客户端通过该抽象层来调用系统。

没问题则逐步将剩余的客户端代码也引流到抽象层。另外在此期间,还是通过抽象层来增加系统单元测试覆盖的好机会。

构建一个新系统来实现新的需求,将部分需要该功能的客户端通过新的抽象层引入新系统。

最后将之前的系统完全删除。

Tip

最近电脑mac升级感觉电脑盒盖休眠后耗电量激增,有时候背在身后都能感收到它的温度。查了下应该是休眠模式被更改了。可以在终端中输入下面的命令查看:

pmset -g

查看hibernatemode这一行,值为3。

通过输入下面命令将该值修改为25:

sudo pmset -a hibernatemode 25

这样休眠模式下的耗电就会降到最低了。

Share

最近对git分支模型做了一定研究,给客户设计了一套分支模型:

该分支模型参考阿里的AoneFlow,对发布分支进行了简化。

该分支模型的好处是:

  • 发布灵活方便。
  • 尽可能地减少合并和冲突。
  • 功能分支独立。
  • master分支随时处于发布状态。

参考文献

  1. 抽象分支
  2. 在阿里,我们如何管理代码分支?

  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!