每周一个 Algorithm,Review 一篇英文文章,总结一个工做中的技术 Tip,以及 Share 一个传递价值观的东西! java
题目:Merge k Sorted Listsnode
描述:程序员
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.算法
Example:数组
Input:缓存
[app
1->4->5,ide
1->3->4,学习
2->6
]spaOutput: 1->1->2->3->4->4->5->6
解题过程:一种思路是多个指针指向链表头,将表头元素放入优先队列 pqueue,每次从中取出一个而后添加到新链表的next,并将取出元素的next放入pqueue,直到队列为空。另外一种思路是分治法,有时间再补上。
解法:
class Solution { public ListNode mergeKLists(ListNode[] lists) { // define priorityQueue PriorityQueue<ListNode> q= new PriorityQueue<ListNode>(lists.size(), new Comparator<ListNode>(){ @Override public int compare(ListNode o1,ListNode o2){ if (o1.val<o2.val) return -1; else if (o1.val==o2.val) return 0; else return 1; } }); // pop queue with list head for (ListNode head : lists) { if (head != null) { q.add(head); } } // pop from queue and append node to new list, add next from poll element to queue ListNode dummy = new ListNode(0); ListNode temp = dummy; while (!q.isEmpty()) { temp.next = q.poll(); if (temp.next.next != null) { q.add(temp.next.next); } temp = temp.next; } return dummy.next; } }
题目:Effective Java Item 6 Eliminate obsolete object references
做者分析三个可能的内存泄漏点:对无用对象保持的引用、缓存 和 监听器及回调方法。
若是你的程序本身在管理内存 ,分配数组或对象空间,计算区分有用和无用数据的下标,例如Vector.java 这个类,那么就有内存泄露的可能。不只是存放在数组中的对象,并且被这些对象引用的对象也一律不会被回收,由于只有程序员知道,而JVM并不知道他们已经废弃。对于这种状况,做者建议是对废弃对象做 null 处理。
对于缓存中的内存泄漏,做者建议使用WeakHashMap 做为缓存,方便JVM在内存不够时回收。这种解决方法有一个前提,就是你认为若是存在对于Key的引用,那么缓存就是有效的,由于这样JVM就不回收WeakHashMap中的对象。
对于监听器的内存泄漏,做者的建议一样是使用WeakReference来 引用他们,当垃圾回收时就会回收他们。
在JDK8中,HashMap有一个比较大的变更,就是当链表长度过长时,查询/插入/删除的复杂度会退化成O(N),经过将链表转化成一颗红黑树,使得复杂度保持在O(LogN)
复杂的事情简单作,是专家;简单的事情重复作,是行家;简单的事情用心作,你会快乐!