每週一個 Algorithm,Review 一篇英文文章,總結一個工作中的技術 Tip,以及 Share 一個傳遞價值觀的東西!
Algorithm: 學習算法
題目: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
解題過程:一種思路是多個指針指向鏈表頭,將表頭元素放入優先隊列 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; } }
Review: 學習英文
題目:Effective Java Item 6 Eliminate obsolete object references
作者分析三個可能的內存泄漏點:對無用對象保持的引用、緩存 和 監聽器及回調方法。
如果你的程序自己在管理內存 ,分配數組或對象空間,計算區分有用和無用數據的下標,例如Vector.java 這個類,那麼就有內存泄露的可能。不僅是存放在數組中的對象,而且被這些對象引用的對象也一概不會被回收,因爲只有程序員知道,而JVM並不知道他們已經廢棄。對於這種情況,作者建議是對廢棄對象作 null 處理。
對於緩存中的內存泄漏,作者建議使用WeakHashMap 作爲緩存,方便JVM在內存不夠時回收。這種解決方法有一個前提,就是你認爲如果存在對於Key的引用,那麼緩存就是有效的,因爲這樣JVM就不回收WeakHashMap中的對象。
對於監聽器的內存泄漏,作者的建議同樣是使用WeakReference來 引用他們,當垃圾回收時就會回收他們。
Tips: 知識點
在JDK8中,HashMap有一個比較大的變動,就是當鏈表長度過長時,查詢/插入/刪除的複雜度會退化成O(N),通過將鏈表轉化成一顆紅黑樹,使得複雜度保持在O(LogN)
Share: 價值觀
複雜的事情簡單做,是專家;簡單的事情重複做,是行家;簡單的事情用心做,你會快樂!