1. 程式人生 > 實用技巧 >leetcode刷題總結701-750

leetcode刷題總結701-750

701. 二叉搜尋樹中的插入操作

  描述:

    

  思路:遞迴。

703. 資料流中的第K大元素

  描述:

    

  思路:維護一個K大小的小頂堆。堆頂就是那個第k大的。

705. 設計雜湊集合

  描述:

    

  思路:建立 bucket陣列。,每個bucker是一個linkedlist。建立hash函式到bucket下表的對映。

706. 設計雜湊對映

  描述:

    

  思路:建立bucket列表(陣列)。每個bucket是一個linkedlist。list中存取pair.首先對pair的keyhash,然後把這個pair新增到liekedlist.

707. 設計連結串列

  描述:

    

  思路:head指標。增刪需要定位pre。

712. 兩個字串的最小ASCII刪除和  

  描述:

    

  思路:

    題意是尋找一個共同子序列,將字串s1和s2刪除為該子序列時所刪除的ASCII綜合最小。
    等價於求一個字串s1和s2的ASCII碼總和最大的共同子序列。
    因為s1和s2的總和固定,當共同子序列的總和最大時,刪除成為該子序列的代價必然最小。

    因此問題轉化為最長共同子序列,dp[i][j]為s1[:i]和s2[:j]的ASCII碼最大的子序列,則:
    dp[i][j] = dp[i-1][j-1] + ASCII(s1[i]), s1[i] == s2[j]

    dp[i][j] = max(dp[i][j-1], dp[i-1][j]), s1[i] != s2[j]

713. 乘積小於K的子陣列

  描述:

    

  思路:滑動視窗。

714. 買賣股票的最佳時機含手續費

  描述;
    

  思路:動態規劃。

    

717. 1位元與2位元字元

  描述:

    

  思路:從後往前,

    1.如果倒數第二位為0,則必然正確;
    2.如果倒數第二位為1,則連續1的個數必須為偶數;

718. 最長重複子陣列

  描述:

    

  思路:

    if(s1.charAt(i) == s2.charAr(j))

    dp[i][j] = dp[i-1][j-1] + 1;
    else
    dp[i][j] = 0;

719. 找出第 k 小的距離對

  描述:

    

  思路:先對陣列排序。然後對最大值最小值進行二分。統計小於二分值的數量是否大於k來決定左指標還是右指標移動。

720. 詞典中最長的單詞

  描述:

    

  思路:建立一個字典樹,往下遍歷。

722. 刪除註釋

  描述:

    

    

  思路:通過一個標誌記錄是否是處於註釋範圍內。。

724. 尋找陣列的中心索引

  描述:

    

  思路:字首和。

725. 分隔連結串列

  描述:

    

  思路:首先對每個均分 len/k。 餘數從第一個開始多加1.

726. 原子的數量

  描述:
    

  思路:棧。

735. 行星碰撞

  描述:

    

  思路:棧。

738. 單調遞增的數字

  描述:

    

  思路:先從尾到頭遍歷一遍,如果出現逆序,大的值減1,並記錄最後一個逆序的位置i,然後把從i開始到末尾的數全部變9

739. 每日溫度

  描述:
    

  思路:棧。

740. 刪除與獲得點數

  描述:

    

  思路:類似於打家劫舍。

      

743. 網路延遲時間

  描述:

    

  思路:迪傑斯特拉。

    

class Solution {
    Map<Integer, Integer> dist;
    public int networkDelayTime(int[][] times, int N, int K) {
        Map<Integer, List<int[]>> graph = new HashMap();
        for (int[] edge: times) {
            if (!graph.containsKey(edge[0]))
                graph.put(edge[0], new ArrayList<int[]>());
            graph.get(edge[0]).add(new int[]{edge[1], edge[2]});
        }
        dist = new HashMap();
        for (int node = 1; node <= N; ++node)
            dist.put(node, Integer.MAX_VALUE);

        dist.put(K, 0);
        boolean[] seen = new boolean[N+1];

        while (true) {
            int candNode = -1;
            int candDist = Integer.MAX_VALUE;
            for (int i = 1; i <= N; ++i) {
                if (!seen[i] && dist.get(i) < candDist) {
                    candDist = dist.get(i);
                    candNode = i;
                }
            }

            if (candNode < 0) break;
            seen[candNode] = true;
            if (graph.containsKey(candNode))
                for (int[] info: graph.get(candNode))
                    dist.put(info[0],
                             Math.min(dist.get(info[0]), dist.get(candNode) + info[1]));
        }

        int ans = 0;
        for (int cand: dist.values()) {
            if (cand == Integer.MAX_VALUE) return -1;
            ans = Math.max(ans, cand);
        }
        return ans;
    }
}
View Code