ARTS打卡活动——第四周

ARTS打卡活动——第四周

1.Algorithm 做一个leetcode的算法题

23. Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:

Input:
[
  1->4->5,
  1->3->4,
  2->6
]
Output: 1->1->2->3->4->4->5->6

解答:这道题可以采用最小堆来实现,首先拿每个链表的表头数据来初始化一个最小堆,然后每次在最小堆中拿出最小的元素A,然后拿A所在的链表的下个元素B来插入最小堆(如果链表为空则不处理),直到所有的链表都为空,具体代码如下:

//Definition for singly-linked list.
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode* mergeKLists(vector& lists) {
        ListNode* pRet = new ListNode(0);
        ListNode *tail = pRet;
        int len = lists.size();
        minHeap = new ListNode *[len + 1];
        //Step 1, fill up
        for (int i = 0; i < len; i++) {
            ListNode *pNode = lists[i];
            if (pNode != NULL) {
                minHeap[++size] = pNode;
            } 
        }
        refresh();
        //Step 2, rolling
        while(size > 0) {
            ListNode *top = getTop();
            tail->next = new ListNode(top->val);
            tail = tail->next;
            replace(top->next);
        }
        return pRet->next;
    }

private:
    ListNode ** minHeap;
    int size = 0;

    void swap(ListNode* &a, ListNode* &b) {
        ListNode *tmp = a;
        a = b;
        b = tmp;
    }

    void heapify(int pos) {
        while(true) {
            int minPos = pos;
            if (pos * 2 <= size && minHeap[pos]->val > minHeap[pos*2]->val)
                minPos = 2 * pos;
            if (pos * 2 + 1 <= size && minHeap[minPos]->val > minHeap[pos*2 + 1]->val)
                minPos = 2 * pos + 1; 
            if (minPos == pos)
                break;
            swap(minHeap[pos], minHeap[minPos]);
            pos = minPos;
        }
    }

    ListNode* getTop() {
        return minHeap[1];
    }

    void replace(ListNode* p) {
        if (p == NULL)
            p = minHeap[size--];
        minHeap[1] = p;
        heapify(1);
    }

    void refresh() {
        for (int i = size / 2; i >= 1; i--) {
            heapify(i);
        }
    }
};

时间复杂度为O(nlogk),其中k是链表的个数,n为所有链表元素的总个数。

2.Review 阅读并点评至少一篇英文技术文章

这周读的文章是Cameron McKenzie写的Is Java slow? Compared to C++, it's faster than you think
这篇文章主要讲述的是Java并不比C++等编译型语言慢,得益于Java语言的内存管理、JIT及时编译技术以及底层架构的各种特性。
Java的执行过程是,先编译成一种中间语言,我们称之为字节码,然后在运行时Java虚拟机将这些字节码转成机器码,最后处理器会执行这些机器码。
相反,像C++这种编译型语言,它是直接编译成机器码,它是基于系统架构来优化各项性能的,也是说它是基于某个系统体系的,对于已经编译好的C++程序,如果换了另外一种系统体系,它就没办法运行或者不能充分利用各种资源;然而Java可以,JVM在解释字节码时,能根据当前可用的资源来优化最终生成的机器代码,从而充分利用资源,C++如果也想利用新的资源,就需要重新编译和重新部署。
所以,Java并不慢,某些方面甚至比C++还要快。

3.Tip 学习至少一个技术技巧

相信很多朋友喜欢用sublime这个编辑器,毕竟功能很强大,然而安装完后,sublime并没有显示在鼠标右键的菜单中,很影响使用(想象一下,每次需要编辑某个文件或者文件夹,都需要打开sublime,然后在里面的菜单选择打开,多麻烦啊)
于是,我就查了下如何将sublime弄到鼠标右键的菜单中,具体步骤如下:

  1. 打开注册表;
  2. 依次打开HKEY_CLASSESS_ROOT->*->Shell这个目录,点击新建项,命名为Edit with Sublime Text3;
  3. 在项“Edit with Sublime Text”下新建字符串值,命名为Icon,值为 xxx\sublime text3\Sublime Text 3\sublime_text.exe,0 (xxx表示sublime安装目录);
  4. 在项“Edit with Sublime Text”下新建项Command,Command项下默认值修改为xxx\sublime text3\Sublime Text 3\sublime_text.exe %1;
  5. 确定后就大功告成了。

4.Share 分享一篇有观点和思考的技术文章

grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)
这篇文章很详细的讲解了Boyer-Moorer算法的原理和实现

你可能感兴趣的:(c++)