[LeetCode] 34. Search for a Range

Given an array of integers sorted in ascending order, 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].

Thought process:
In order to make the time complexity O(logn), we need to perform two binary searches for the left end and right end. 
  1. When searching for the left end, we want the result to be as left as possible, so we set end = mid when mid == target.
  2. When searching for the right end, we want the result to be as right as possible, so we set start = mid when mid == target.
Remember to check for empty array before calling nums.length. 

Solution:

C++:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if (nums.size() == 0) {
            return vector<int>(2, -1);
        }
        
        vector<int> range;
        size_t start = 0;
        size_t end = nums.size() - 1;
        
        while (start + 1 < end) {
            int mid = start + (end - start) / 2;
            
            if (nums[mid] >= target) {
                end = mid;
            } else {
                start = mid;
            }
        }
        
        if (nums[start] == target) {
            range.push_back(start);
        } else if (nums[end] == target) {
            range.push_back(end);
        } else {
            return vector<int>(2, -1);
        }
        
        start = 0;
        end = nums.size() - 1;
        
        while (start + 1 < end) {
            int mid = start + (end - start) / 2;
            
            if (nums[mid] <= target) {
                start = mid;
            } else {
                end = mid;
            }
        }
        
        if (nums[end] == target) {
            range.push_back(end);
        } else {
            range.push_back(start);
        }
        
        return range;
    }
};

Java:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] range = { -1, -1 };
        if (nums.length == 0) {
            return range;
        }
        
        int start = 0;
        int end = nums.length - 1;
        while (start + 1 < end) {
            int mid = start + (end - start) / 2;
            if (nums[mid] == target || nums[mid] > target) {
                end = mid;
            } else {
                start = mid;
            }
        }
        
        if (nums[start] == target) {
            range[0] = start;
        } else if (nums[end] == target) {
            range[0] = end;
        } else {
            return range;
        }
        
        start = 0;
        end = nums.length - 1;
        while (start + 1 < end) {
            int mid = start + (end - start) / 2;
            if (nums[mid] == target || nums[mid] < target) {
                start = mid;
            } else {
                end = mid;
            }
        }
        
        if (nums[end] == target) {
            range[1] = end;
        } else {
            range[1] = start;
        }
        
        return range;
    }
}

Time complexity:
Each search takes O(logn) respectively. The overall complexity is O(logn).

Comments

Popular posts from this blog

[LeetCode] 714. Best Time to Buy and Sell Stock with Transaction Fee

[LeetCode] 269. Alien Dictionary

[LeetCode] 631. Design Excel Sum Formula