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<ListNode*>& 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弄到鼠标右键的菜单中,具体步骤如下:
- 打开注册表;
- 依次打开HKEY_CLASSESS_ROOT->*->Shell这个目录,点击新建项,命名为Edit with Sublime Text3;
- 在项“Edit with Sublime Text”下新建字符串值,命名为Icon,值为 xxx\sublime text3\Sublime Text 3\sublime_text.exe,0 (xxx表示sublime安装目录);
- 在项“Edit with Sublime Text”下新建项Command,Command项下默认值修改为xxx\sublime text3\Sublime Text 3\sublime_text.exe %1;
- 确定后就大功告成了。
4.Share 分享一篇有观点和思考的技术文章
grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)
这篇文章很详细的讲解了Boyer-Moorer算法的原理和实现
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。