• 每周学算法/读英文/知识点心得分享 3.11


     每周一个 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: 价值观

    复杂的事情简单做,是专家;简单的事情重复做,是行家;简单的事情用心做,你会快乐!

  • 相关阅读:
    洛谷 P5043 树的同构 题解
    CF 1178E Archaeology 题解
    UVA 1642 MagicalGCD 题解
    洛谷 P3919 可持久化线段树 题解
    SPOJ 4003 Phone List 题解
    OI/ACM最全卡常大招
    洛谷 P3368 树状数组 题解
    逆序对
    洛谷 U78696 图书馆馆长的考验 题解
    原创 疲劳炉石传说
  • 原文地址:https://www.cnblogs.com/andrew-chen/p/10538489.html
Copyright © 2020-2023  润新知