显示标签为“LintCode”的博文。显示所有博文
显示标签为“LintCode”的博文。显示所有博文

2016年7月14日星期四

[笔记整理] 九章算法第二章 Binary Search & Sorted Array Part2

1. Search for a Range
<=> How many times did a number appear?  range[x1, x2] => x2-x1+1

* The insertion position may not be in current array
* Find the insertion position, 3 positions to check: x<start, start<x<end, x>end


* No duplicate
* 2 possible position for mid: [mid] >= [0], [mid] < [0]
* 4 possible position for target: [0]<T<[mid], [0]<[mid]<T, T<[mid]<[0], [mid]<T<[0]

* Duplicate

* Worst case for binary search - O(n) e.g. If in every iteration, [mid]==[0]/[mid]==[length-1] =>O(n)

* Any element in row1 < Any element in row 2
* Use binary search for 2 times, 1st time find the row of target, 2nd time find the column of target

[1 0 2 4]
[1 2 6 9]
[3 5 7 10]
[7 8 9 11]
* Quadrate search O(n)
* Search from left bottom to right top, exclude 1 row/column each iteration, O(m + n)



* peak <=> A[p] > A[p - 1] && A[p] >A[p + 1]

9. Remove Duplicate from Sorted Array

10. Remove Duplicate from Sorted Array II

11. Merge Sorted Array

* Merge + Find O(m + n)
* Find kth largest O(logn)
when (m+n) is odd=>k=(m+n)/2+1
when (m+n) is even=>k1=(m+n)/2, k2=(m+n)/2+1
* How to find kth largest?

Throw away each k/2 elements in each iteration

* Sort, O(1) space O(nlogn) time
* 3 times reverse, O(1) space O(n) time

* abcdefg, offset=3 => efgabcd

* reverse each word, then reverse the entire string


2015年7月11日星期六

[LintCode] Sliding Window Maximum

Problem:

Given an array of n integer with duplicate number, and a moving window(size k), move the window at each iteration from the start of the array, find the maximum number inside the window at each moving.

Thinking:

维护一个deque来保存index,保证:
(1)从 deque.peekLast() 到 deque.peekFirst() 对应的nums[i] (deque.peekFirst() <= i <= deque.peekLast()) 的值递减
(2)对于第i个滑动窗口,deque.peekLast() > i - k,即deque的最后一个元素一定在当前的第 i 个滑动窗口内。
(3)对于第i个滑动窗口,对应的maximum值一定是 deque.peekLast()。

Java Code:

public class Solution {
    /**
     * @param nums: A list of integers.
     * @return: The maximum number inside the window at each moving.
     */
    public ArrayList<Integer> maxSlidingWindow(int[] nums, int k) {
        // write your code here
        ArrayList<Integer> result = new ArrayList<Integer>();
        if (nums == null || nums.length == 0) {
            return result;
        }
        
        Deque<Integer> deque = new LinkedList<Integer>();
        deque.add(0);
        
        for (int i = 1; i < k; i++) {
            while (deque.size() > 0 && nums[i] >= nums[deque.peekFirst()]) {
                deque.pollFirst();
            }
            deque.addFirst(i);
        }
        
        for (int i = k; i < nums.length; i++) {
            result.add(nums[deque.peekLast()]);
            
            while (deque.size() > 0 && nums[i] > nums[deque.peekFirst()]) {
                deque.removeFirst();
            }
            deque.addFirst(i);
            
            if (deque.peekLast() <= i - k) {
                deque.removeLast();
            }
        }
        
        result.add(nums[deque.peekLast()]);
        return result;
    }
}



优化了一下(2015-07-19)(这个是 LeetCode 的了):

public class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums == null || nums.length == 0) {
            return new int[0];
        }
        
        int[] result = new int[nums.length - k + 1];
        
        Deque<Integer> deque = new LinkedList<Integer>();
        
        for (int i = 0, j = 0; j < result.length; i++) {
            while (deque.size() != 0 &&
                   nums[deque.peekFirst()] < nums[i]) {
                deque.removeFirst();
            }
            deque.addFirst(i);
            
            if (i < k - 1) {
                continue;
            }
            
            if (deque.peekLast() <= i - k) {
                deque.removeLast();
            }
            result[j++] = nums[deque.peekLast()];
        }
        
        return result;
    }
}

Reference:

http://codercareer.blogspot.com/2012/02/no-33-maximums-in-sliding-windows.html