Showing posts with label TreeMap. Show all posts
Showing posts with label TreeMap. Show all posts

LeetCode 1146 - Snapshot Array


https://leetcode.com/problems/snapshot-array/
Implement a SnapshotArray that supports the following interface:
  • SnapshotArray(int length) initializes an array-like data structure with the given length.  Initially, each element equals 0.
  • void set(index, val) sets the element at the given index to be equal to val.
  • int snap() takes a snapshot of the array and returns the snap_id: the total number of times we called snap() minus 1.
  • int get(index, snap_id) returns the value at the given index, at the time we took the snapshot with the given snap_id

Example 1:
Input: ["SnapshotArray","set","snap","set","get"]
[[3],[0,5],[],[0,6],[0,0]]
Output: [null,null,0,null,5]
Explanation: 
SnapshotArray snapshotArr = new SnapshotArray(3); // set the length to be 3
snapshotArr.set(0,5);  // Set array[0] = 5
snapshotArr.snap();  // Take a snapshot, return snap_id = 0
snapshotArr.set(0,6);
snapshotArr.get(0,0);  // Get the value of array[0] with snap_id = 0, return 5
Constraints:
  • 1 <= length <= 50000
  • At most 50000 calls will be made to setsnap, and get.
  • 0 <= index < length
  • 0 <= snap_id < (the total number of times we call snap())
  • 0 <= val <= 10^9
X. Binary search
https://leetcode.com/problems/snapshot-array/discuss/350562/JavaPython-Binary-Search
    TreeMap<Integer, Integer>[] A;
    int snap_id = 0;
    public SnapshotArray(int length) {
        A = new TreeMap[length];
        for (int i = 0; i < length; i++) {
            A[i] = new TreeMap<Integer, Integer>();
            A[i].put(0, 0);
        }
    }

    public void set(int index, int val) {
        A[index].put(snap_id, val);
    }

    public int snap() {
        return snap_id++;
    }

    public int get(int index, int snap_id) {
        return A[index].floorEntry(snap_id).getValue();
    }
https://leetcode.com/problems/snapshot-array/discuss/350648/Java-O(1)-snap-O(logN)-getset-using-TreeMap
    List<TreeMap<Integer, Integer>> arr;
    int currId = 0;

    public SnapshotArray(int length) {
        arr = new ArrayList();
        
        for (int i = 0; i < length; i++) {
            arr.add(i, new TreeMap<Integer, Integer>());
            arr.get(i).put(0, 0);
        }
    }
    
    public void set(int index, int val) {
        arr.get(index).put(currId, val);
    }
    
    public int snap() {
        return currId++;
    }
    
    public int get(int index, int snap_id) {
        return arr.get(index).floorEntry(snap_id).getValue();
    }
https://leetcode.com/problems/snapshot-array/discuss/350574/Java-Two-codes-w-analysis-store-difference-by-HashMap-and-TreeMap-respectively.
Store to a HashMap the set() results since previous snapshot.
Analysis:
Time: Each call of get() cost O(snap_id), othersO(1);
Space: Total cost O(n), where n is number of calls of set().
    private List<Map<Integer, Integer>> shot;
    private Map<Integer, Integer> diff;
    
    public SnapshotArray(int length) {
        shot  = new ArrayList<>(length);
        diff  = new HashMap<>(length);
    }
    
    public void set(int index, int val) {
        diff.put(index, val);
    }
    
    public int snap() {
        shot.add(diff);
        diff = new HashMap<>();
        return shot.size() - 1;
    }
    
    public int get(int index, int snap_id) {
        for (int i = snap_id; i >= 0; --i)
             if (shot.get(i).containsKey(index))   
                 return shot.get(i).get(index); 
        return 0;
    }

Method 2: TreeMap
Store the set() result together with current snapshot count to the TreeMap of the specified index.
Analysis:
Time: Instantiation cost O(length), each call of get()/set() cost O(log(count))snap() O(1);
Space: Total cost O(length + count).
    private int count;
    private List<TreeMap<Integer, Integer>> shot = new ArrayList<>();
    
    public SnapshotArray(int length) {
        IntStream.range(0, length).forEach(i -> { shot.add(new TreeMap<>()); });
    }
    
    public void set(int index, int val) {
        shot.get(index).put(count, val);
    }
    
    public int snap() {
        return count++;
    }
    
    public int get(int index, int snap_id) {
        Integer key = shot.get(index).floorKey(snap_id);
        return key == null ? 0 : shot.get(index).get(key);
    }
https://www.cnblogs.com/lz87/p/11314526.html
Each index has its own treemap to store all needed values of different snap ids information. For a key value pair(k, v) in an index's treemap, it means starting from snap id k, until there is a newer snap, the value is v. ThisInstead of copy the whole array,
we can only record the changes of set.

Explanation

The idea is, the whole array can be large,
and we may take the snap tons of times.
(Like you may always ctrl + S twice)
Instead of record the history of the whole array,
we will record the history of each cell.
And this is the minimum space that we need to record all information.
For each A[i], we will record its history.
With a snap_id and a its value.
When we want to get the value in history, just binary search the time point.

Complexity

Time O(logS)
Space O(S)
where S is the number of set called.
SnapshotArray(int length) is O(N) time
set(int index, int val) is O(1) in Python and O(logSnap) in Java
snap() is O(1)
get(int index, int snap_id) is O(logSnap) representation helps achieve the following properties.
1. O(N) init, O(logS) get and set, where N is the total number of indices and S is the total number of snaps for an index.
2. If there is no value update at index i for consecutive snap shots, there will be only a snap_id to value mapping. When setting a new value at index i, it first check the last entry of its map, this is the latest value prior to this update operation. Only insert a new mapping if the new value is the same with the previous value, which means starting from this new snap id, the value is the new value.  
3. When calling the get method, it tries to find the a key-value mapping associated with the greatest key less than or equal to the given key snap id. 
复制代码
class SnapshotArray {
    private TreeMap<Integer, Integer>[] snapMap;
    private int snapId = 0;
    public SnapshotArray(int length) {
        snapMap = new TreeMap[length];
        for (int i = 0; i < length; i++) {
            snapMap[i] = new TreeMap<Integer, Integer>();
            snapMap[i].put(0, 0);
        }
    }

    public void set(int index, int val) {
        Map.Entry<Integer, Integer> lastEntry = snapMap[index].lastEntry();
        if(val != lastEntry.getValue()) {
            snapMap[index].put(snapId, val);
        }        
    }

    public int snap() {
        return snapId++;
    }

    public int get(int index, int snap_id) {
        return snapMap[index].floorEntry(snap_id).getValue();
    }

https://www.acwing.com/solution/LeetCode/content/3431/
实现支持下列接口的快照数组:
  • SnapshotArray(int length) 初始化一个与指定长度相等的类似于数组的数据结构。初始时,每个元素都等于 0
  • void set(index, val) 会将指定索引 index 处的元素设置为 val
  • int snap() 获取该数组的快照,并返回快照的编号 snap_id(快照号是调用 snap() 的总次数减去 1)。
  • int get(index, snap_id) 根据指定的 snap_id 选择快照,并返回该快照指定索引 index 的值。
(数据结构,二分)
  1. 我们在普通数组的基础上进行改造,每个位置都存储一个新动态数组,存储每个版本(如果有)下的更改。
  2. 初始时,我们建立长度为 length 的数组,每个位置是一个长度为 1 的数组,仅保存版本号 0 和 元素 0 的一个数对。
  3. 修改时,我们去 index 位置的数组中的最后一个位置,如果那个位置的版本号等于当前计数器的版本号,则直接修改元素值;否则新插入一个数对,记录当前版本号和元素值。
  4. 快照时,直接更新计数器。
  5. 查询时,我们得到那个位置的数组,然后开始二分,找到小于等于待查询版本的最大版本的那个数对,返回数对的元素值即可。

时间复杂度

  • 初始化时间复杂度为 O(length)
  • 修改元素的时间复杂度为 O(1)
  • 快照的时间复杂度为 O(1)
  • 查询的时间复杂度最坏为 O(logS),其中 S 为快照的次数。

空间复杂度

  • 最坏需要 O(length+Q) 的空间,其中 Q 为操作的总次数

    vector<vector<pair<int, int>>> arr;
    int counter;

    SnapshotArray(int length) {
        arr.resize(length, vector<pair<int, int>>(1));
        for (int i = 0; i < length; i++)
            arr[i][0] = make_pair(0, 0);
        counter = 0;
    }

    void set(int index, int val) {
        auto &x = arr[index][arr[index].size() - 1];
        if (x.first == counter)
            x.second = val;
        else {
            arr[index].emplace_back(make_pair(counter, val));
        }
    }

    int snap() {
        return counter++;
    }

    int get(int index, int snap_id) {
        auto &v = arr[index];
        int l = 0, r = v.size() - 1;
        while (l < r) {
            int mid = (l + r) >> 1;
            if (snap_id >= v[mid + 1].first)
                l = mid + 1;
            else
                r = mid;
        }
        return v[l].second;
    }

X.
https://www.codetd.com/en/article/6973297
Each location to open up a space that is only saved in this location 变化
because of the number of changes in each location is not the same
when you want value, they look for less input snap_id latest变化
  • Use List + Map data structures to build an array of snapshots
List changes in store for each position
value after the change: TreeMap single storage changes in key: snapshot number value
Use List + Map
  • Examples of its structure

ArrayList + TreeMap

class SnapshotArray {
    // List 存储每个位置的变动情况
    // TreeMap 存储单次变动情况 key:快照编号 value:变动后的值
    // [index,[(snapId, val), (snapId, val)...]]
    List<TreeMap<Integer, Integer>> list = new ArrayList<>();
    // 当前快照编号
    int snapId = 0;

    // 初始化
    public SnapshotArray(int length) {
        snapId = 0;
        // 开始每个位置全为0
        for (int i = 0; i < length; i++) {
            TreeMap<Integer, Integer> t = new TreeMap<>();
            t.put(snapId, 0);
            list.add(t);
        }
    }
    
    public void set(int index, int val) {
        // 重复就覆盖
        list.get(index).put(snapId, val);
    }
    
    public int snap() {
        int res = snapId;
        snapId++;
        return res;
    }
    
    /**
     * 难点 
     * 需要在TreeMap的key值中寻找小于快照编号snap_id的数据
     * 
     * 这里取巧使用了自带的方法 
     * floorEntry(key) 找到key值接近snap_id的实体Entry
     **/
    public int get(int index, int snap_id) {
        TreeMap<Integer, Integer> t = list.get(index);
        return t.floorEntry(snap_id).getValue();
    }
X. https://leetcode.com/problems/snapshot-array/discuss/383030/Java-Binary-Search-Solution
  // int[0]: snapId, int[1]:val
  private List<int[]>[] snapshots;
  private int snapId;

  public SnapshotArray(int length) {
    snapId = 0;
    snapshots = new List[length];
    
    for (int i = 0; i < length; i++) {
      List<int[]> snapListEachItem = new ArrayList<>();
      snapListEachItem.add(new int[] {0, 0});
      snapshots[i] = snapListEachItem;
    }
    
  }

  public void set(int index, int val) {
    List<int[]> snapsOfIndex = snapshots[index];
    int[] lastSnap = snapsOfIndex.get(snapsOfIndex.size() - 1);
    
    // If last snap id is less than current id then add a new snap.
    if (lastSnap[0] < snapId) {
      snapsOfIndex.add(new int[] {snapId, val});
      return;
    }
    
    lastSnap[0] = snapId;
    lastSnap[1] = val;
  }

  public int snap() {
    return snapId++;
  }

  public int get(int index, int snap_id) {
    List<int[]> snaps = snapshots[index];
    return binarySearch(snaps, snap_id);
  }
  
  private int binarySearch(List<int[]> snaps, int snapId) {
    int low = 0, high = snaps.size() - 1;
    
    while (low <= high) {
      int mid = low + (high - low) / 2;
      
      if (snaps.get(mid)[0] < snapId) {
        low = mid + 1;
      } else if (snaps.get(mid)[0] > snapId) {
        high = mid - 1;
      } else {
        return snaps.get(mid)[1];
      }
    }
    
    return low == 0 ? snaps.get(0)[1] : snaps.get(low - 1)[1];
  }

中间60%的k window之和


中间60%的k window之和
面经题,一个integer数组,返回k window的和,除去前后20%

另外的描述:有一个大小为n的数组,一个大小为k的窗口,1<k<=n, 窗口在数组上slide,每到一个位置去掉数值大小前x% 和后x%的数,然后求剩下的数的均值。对每一个窗口算一次,最后output出一个数组。求一个 nlogn的解法。。。

https://www.1point3acres.com/bbs/thread-490357-1-1.html
https://www.1point3acres.com/bbs/thread-477503-1-1.html


这可太segment tree了

感觉可以用一个maxheap和一个minheap 大小分别为size = x% * k 来做
窗口从左走到右。
每次统计当前窗口内的数值。如果一个人sort当前窗口后,中间的100% - 2x%值求平均。 
这样一个窗口会得到一个值。

如果我的这个理解是对的话,那么可以考虑先clone并全局sort一次得到每个数值的代号,用1个TreeSet来维护窗口来求-x% 和 x%。然后在树状数组里维护并求和。这样到好像的确是NLogN哦。

补充内容 (2019-2-19 01:47):
不用树状数组了,用三个TreeSet来维护0~x%, x~100-x% 和 100-x~100%。count是常数,用sum来记录中间的那个treeset的和。

请问大小x%是全局还是窗口的?

我猜大概是当前的,如果是全局的,O(n) 就可以。 这题用treemap做

这种sliding window的medium,average之类八成是multiset (BST/TreeSet)来做 我的想法就是每次删掉前面已经不在window的数,然后再减去前后x%? 但我想不出能够优化求和的更好方法了



这道题就是离扣四巴陵的变种,在java的条件下,用heap的时间复杂度是 O(n*k),因为要把元素从heap里删掉, 如果不是堆顶元素的话,就需要O(k)复杂度。



LeetCode 975 - Odd Even Jump


https://leetcode.com/problems/odd-even-jump/
You are given an integer array A.  From some starting index, you can make a series of jumps.  The (1st, 3rd, 5th, ...) jumps in the series are called odd numbered jumps, and the (2nd, 4th, 6th, ...) jumps in the series are called even numbered jumps.
You may from index i jump forward to index j (with i < j) in the following way:
  • During odd numbered jumps (ie. jumps 1, 3, 5, ...), you jump to the index j such that A[i] <= A[j] and A[j] is the smallest possible value.  If there are multiple such indexes j, you can only jump to the smallest such index j.
  • During even numbered jumps (ie. jumps 2, 4, 6, ...), you jump to the index j such that A[i] >= A[j] and A[j] is the largest possible value.  If there are multiple such indexes j, you can only jump to the smallest such index j.
  • (It may be the case that for some index i, there are no legal jumps.)
A starting index is good if, starting from that index, you can reach the end of the array (index A.length - 1) by jumping some number of times (possibly 0 or more than once.)
Return the number of good starting indexes.

Example 1:


Input: [10,13,12,14,15]
Output: 2
Explanation: 
From starting index i = 0, we can jump to i = 2 (since A[2] is the smallest among A[1], A[2], A[3], A[4] that is greater or equal to A[0]), then we can't jump any more.
From starting index i = 1 and i = 2, we can jump to i = 3, then we can't jump any more.
From starting index i = 3, we can jump to i = 4, so we've reached the end.
From starting index i = 4, we've reached the end already.
In total, there are 2 different starting indexes (i = 3, i = 4) where we can reach the end with some number of jumps.

X.

https://leetcode.com/problems/odd-even-jump/discuss/217981/JavaC%2B%2BPython-DP-idea-Using-TreeMap-or-Stack
We need to jump higher and lower alternately to the end.
Take [5,1,3,4,2] as example.
If we start at 2,
we can jump either higher first or lower first to the end,
because we are already at the end.
higher(2) = true
lower(2) = true
If we start at 4,
we can't jump higher, higher(4) = false
we can jump lower to 2, lower(4) = higher(2) = true
If we start at 3,
we can jump higher to 4, higher(3) = lower(4) = true
we can jump lower to 2, lower(3) = higher(2) = true
If we start at 1,
we can jump higher to 2, higher(1) = lower(2) = true
we can't jump lower, lower(1) = false
If we start at 5,
we can't jump higher, higher(5) = false
we can jump lower to 4, lower(5) = higher(4) = false
    public int oddEvenJumps(int[] A) {
        int n  = A.length, res = 1;
        boolean[] higher = new boolean[n], lower = new boolean[n];
        higher[n - 1] = lower[n - 1] = true;
        TreeMap<Integer, Integer> map = new TreeMap<>();
        map.put(A[n - 1], n - 1);
        for (int i = n - 2; i >= 0; --i) {
            Map.Entry hi = map.ceilingEntry(A[i]), lo = map.floorEntry(A[i]);
            if (hi != null) higher[i] = lower[(int)hi.getValue()];
            if (lo != null) lower[i] = higher[(int)lo.getValue()];
            if (higher[i]) res++;
            map.put(A[i], i);
        }
        return res;
    }
https://leetcode.com/problems/odd-even-jump/discuss/217974/Java-solution-DP-%2B-TreeMap
First let's create a boolean DP array.
dp[i][0] stands for you can arrive index n - 1 starting from index i at an odd step.
dp[i][1] stands for you can arrive index n - 1 starting from index i at an even step.
Initialization:
Index n - 1 is always a good start point, regardless it's odd or even step right now. Thus dp[n - 1][0] = dp[n - 1][1] = true.
DP formula:
dp[i][0] = dp[index_next_greater_number][1] - because next is even step
dp[i][1] = dp[index_next_smaller_number][0] - because next is odd step
Result:
Since first step is odd step, then result is count of dp[i][0] with value true.
To quickly find the next greater or smaller number and its index: traverse the array reversely and store data into a TreeMap using the number as Key and its index as Value.
Time complexity O(nlgn), Space complexity O(n). n is the length of the array.
    public int oddEvenJumps(int[] A) {
        int n = A.length;
        TreeMap<Integer, Integer> map = new TreeMap<>();
        boolean[][] dp = new boolean[n][2];
        dp[n - 1][0] = true;
        dp[n - 1][1] = true;
        map.put(A[n - 1], n - 1);
        int res = 1;

        for (int i = n - 2; i >= 0; i--) {
            // Odd step
            Integer nextGreater = map.ceilingKey(A[i]);
            if (nextGreater != null) {
                dp[i][0] = dp[map.get(nextGreater)][1];
            }
            // Even step
            Integer nextSmaller = map.floorKey(A[i]);
            if (nextSmaller != null) {
                dp[i][1] = dp[map.get(nextSmaller)][0];
            }
            map.put(A[i], i);

            res += dp[i][0] ? 1 : 0;
        }

        return res;
    }

As in Approach 1, the problem reduces to solving this question: for some index i during an odd numbered jump, what index do we jump to (if any)?
Algorithm
We can use a TreeMap, which is an excellent structure for maintaining sorted data. Our map vals will map values v = A[i] to indices i.
Iterating from i = N-2 to i = 0, we have some value v = A[i] and we want to know what the next largest or next smallest value is. The TreeMap.lowerKey and TreeMap.higherKey functions do this for us.
With this in mind, the rest of the solution is straightforward: we use dynamic programming to maintain odd[i] and even[i]: whether the state of being at index i on an odd or even numbered jump is possible to reach
  public int oddEvenJumps(int[] A) {
    int N = A.length;
    if (N <= 1)
      return N;
    boolean[] odd = new boolean[N];
    boolean[] even = new boolean[N];
    odd[N - 1] = even[N - 1] = true;

    TreeMap<Integer, Integer> vals = new TreeMap();
    vals.put(A[N - 1], N - 1);
    for (int i = N - 2; i >= 0; --i) {
      int v = A[i];
      if (vals.containsKey(v)) {
        odd[i] = even[vals.get(v)];
        even[i] = odd[vals.get(v)];
      } else {
        Integer lower = vals.lowerKey(v);
        Integer higher = vals.higherKey(v);

        if (lower != null)
          even[i] = odd[vals.get(lower)];
        if (higher != null) {
          odd[i] = even[vals.get(higher)];
        }
      }
      vals.put(v, i);
    }

    int ans = 0;
    for (boolean b : odd)
      if (b)
        ans++;
    return ans;

  }
https://leetcode.com/articles/odd-even-jump/
Time Complexity: O(N \log N), where N is the length of A.
Approach 1: Monotonic Stack
Intuition
First, we notice that where you jump to is determined only by the state of your current index and the jump number parity.
For each state, there is exactly one state you could jump to (or you can't jump.) If we somehow knew these jumps, we could solve the problem by a simple traversal.
So the problem reduces to solving this question: for some index i during an odd numbered jump, what index do we jump to (if any)? The question for even-numbered jumps is similar.
Algorithm
Let's figure out where index i jumps to, assuming this is an odd-numbered jump.
Let's consider each value of A in order from smallest to largest. When we consider a value A[j] = v, we search the values we have already processed (which are <= v) from largest to smallest. If we find that we have already processed some value v0 = A[i] with i < j, then we know i jumps to j.
Naively this is a little slow, but we can speed this up with a common trick for harder problems: a monotonic stack. (For another example of this technique, please see the solution to this problem: (Article - Sum of Subarray Minimums))
Let's store the indices i of the processed values v0 = A[i] in a stack, and maintain the invariant that this is monotone decreasing. When we add a new index j, we pop all the smaller indices i < j from the stack, which all jump to j.
Afterwards, we know oddnext[i], the index where i jumps to if this is an odd numbered jump. Similarly, we know evennext[i]. We can use this information to quickly build out all reachable states using dynamic programming.

class Solution(object):
    def oddEvenJumps(self, A):
        N = len(A)

        def make(B):
            ans = [None] * N
            stack = []  # invariant: stack is decreasing
            for i in B:
                while stack and i > stack[-1]:
                    ans[stack.pop()] = i
                stack.append(i)
            return ans

        B = sorted(range(N), key = lambda i: A[i])
        oddnext = make(B)
        B.sort(key = lambda i: -A[i])
        evennext = make(B)

        odd = [False] * N
        even = [False] * N
        odd[N-1] = even[N-1] = True

        for i in xrange(N-2, -1, -1):
            if oddnext[i] is not None:
                odd[i] = even[oddnext[i]]
            if evennext[i] is not None:
                even[i] = odd[evennext[i]]

        return sum(odd)


    int oddEvenJumps(vector<int>& A) {
        int n = A.size();
        int odd[n], even[n];
        
        stack<pair<int, int>> s;
        vector<pair<int, int>> indices;
        for (int i = 0; i < n; i++)
            indices.emplace_back(A[i], -i);
        sort(indices.begin(), indices.end());
        for (int i = 0; i < n; i++)
            indices[i].second = -indices[i].second;
        for (int i = 0; i < n; i++) {
            while (!s.empty() && indices[i].second > s.top().second) {
                s.pop();
            }
            if (s.empty())
                even[indices[i].second] = -1;
            else
                even[indices[i].second] = s.top().second;
            s.push(indices[i]);
        }
        
        s = stack<pair<int, int>>();
        indices.clear();
        for (int i = 0; i < n; i++)
            indices.emplace_back(A[i], i);
        sort(indices.begin(), indices.end());
        for (int i = n - 1; i >= 0; i--) {
            while (!s.empty() && indices[i].second > s.top().second)
                s.pop();
            if (s.empty())
                odd[indices[i].second] = -1;
            else
                odd[indices[i].second] = s.top().second;
            s.push(indices[i]);
        }
        
        int oddjump[n], evenjump[n];
        int ans = 0;
        for (int i = n - 1; i >= 0; i--) {
            if (odd[i] != -1) oddjump[i] = evenjump[odd[i]];
            else oddjump[i] = i;
            if (even[i] != -1) evenjump[i] = oddjump[even[i]];
            else evenjump[i] = i;
            if (oddjump[i] == n - 1) ans++;
        }
        return ans;
    }


In Python, I used stack to find next_higher and next_lower
    def oddEvenJumps(self, A):
        n = len(A)
        next_higher, next_lower = [0] * n, [0] * n

        stack = []
        for a, i in sorted([a, i] for i, a in enumerate(A)):
            while stack and stack[-1] < i:
                next_higher[stack.pop()] = i
            stack.append(i)

        stack = []
        for a, i in sorted([-a, i] for i, a in enumerate(A)):
            while stack and stack[-1] < i:
                next_lower[stack.pop()] = i
            stack.append(i)

        higher, lower = [0] * n, [0] * n
        higher[-1] = lower[-1] = 1
        for i in range(n - 1)[::-1]:
            higher[i] = lower[next_higher[i]]
            lower[i] = higher[next_lower[i]]
        return sum(higher)
X. DP + Get next greater/smaller 

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts