Leetcode: Search for a Range



Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
public int[] searchRange(int[] A, int target) {
int i=0;
int j=A.length-1;
int[] results={-1,-1};
//the idea is to put the lower bound in i
while(i<j){
int mid=i+(j-i)/2;
if(target<=A[mid])
j=mid;
else
i=mid+1;
}
if(A[i]==target)
results[0]=i;
else
return results;
i=0;
j=A.length;
//the idea is to put the upper bound in j-1
while(i<j){
int mid=i+(j-i)/2;
if(target>=A[mid])
i=mid+1;
else
j=mid;
}
results[1]=j-1;
return results;
}
Code from http://www.darrensunny.me/leetcode-search-for-a-range/
public int[] searchRange(int[] A, int target) {
    int[] result = {-1, -1};
    int n = A.length;
    if (A == null || n == 0)
        return result;
    // Find one target first
    int separator = -1;         // The index of one of several appearances of target
    int left = 0, right = n-1;
    while (left <= right) {
        int middle = (left+right) / 2;
        if (A[middle] > target) {   // target must be at the left half
            right = middle - 1;
        } else if (A[middle] < target) {    // target must be at the right half
            left = middle + 1;
        } else {            // Find one target
            separator = middle;
            break;
        }
    }
    if (separator == -1)        // No target exists
        return result;
 
    // Find the starting index within A[0...separator]
    left = 0;
    right = separator;
    while (left <= right) {
        int middle = (left+right) / 2;
        if (A[middle] == target)    // right will end up at right before the starting index
            right = middle - 1;
        else        // A[middle]<target; the starting index should be within [middle+1,right]
            left = middle + 1;
    }   // out of loop; left = right - 1, i.e. the starting index
    result[0] = left;   // Save the starting index in result[0]
 
    // Find the ending index within A[separator+1...n-1]
    left = separator;
    right = n - 1;
    while (left <= right) {
        int middle = (left+right) / 2;
        if (A[middle] == target)    // left will end up at right after the ending index
            left = middle + 1;
        else        // A[middle]>target; the starting index should be within [left, middle-1]
            right = middle - 1;
    }   // out of loop; right = left + 1, i.e. the ending index
    result[1] = right;  // Save the ending index in result[1]
 
    return result;
}
Also check http://zhaohongze.com/wordpress/2014/01/05/leetcode-search-for-a-range/
Read full article from 西小瓜: Leetcode: Search for a Range

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts