Difficulty: Medium
Given an array of integers nums 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].
Example 1:
| 12
 
 | Input: nums = [5,7,7,8,8,10], target = 8Output: [3,4]
 
 | 
Example 2:
| 12
 
 | Input: nums = [5,7,7,8,8,10], target = 6Output: [-1,-1]
 
 | 
Solution
Language: Java
| 12
 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
 
 | class Solution {public int[] searchRange(int[] nums, int target) {
 if (nums == null || nums.length == 0) {
 return new int[] {-1, -1};
 }
 int left, right = 0;
 int start = 0;
 int end = nums.length - 1;
 while (start + 1 < end) {
 int mid = start + (end - start) / 2;
 if (nums[mid] == target) {
 start = mid;
 } else if (nums[mid] > target) {
 end = mid;
 } else {
 start = mid;
 }
 }
 if (nums[end] == target) {
 right = end;
 } else if (nums[start] == target) {
 right = start;
 } else {
 return new int[] {-1, -1};
 }
 start = 0;
 end = nums.length - 1;
 while (start + 1 < end) {
 int mid = start + (end - start) / 2;
 if (nums[mid] == target) {
 end = mid;
 } else if (nums[mid] > target) {
 end = mid;
 } else {
 start = mid;
 }
 }
 if (nums[start] == target) {
 left = start;
 } else {
 left = end;
 }
 return new int[] {left, right};
 }
 }
 
 | 
| 12
 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
 
 | class Solution {public int[] searchRange(int[] nums, int target) {
 if (nums == null || nums.length == 0) {
 return new int[]{-1, -1};
 }
 return new int[] {search(nums, target, true), search(nums, target, false)};
 }
 
 private int search(int[] nums, int target, boolean isLeft) {
 int start = 0, end = nums.length - 1;
 while (start + 1 < end) {
 int mid = start + (end - start) / 2;
 if (nums[mid] == target) {
 if (isLeft) {
 end = mid;
 } else {
 start = mid;
 }
 } else if (nums[mid] < target) {
 start = mid;
 } else {
 end = mid;
 }
 }
 if (isLeft) {
 if (nums[start] == target) {
 return start;
 }
 if (nums[end] == target) {
 return end;
 }
 } else {
 if (nums[end] == target) {
 return end;
 }
 if (nums[start] == target) {
 return start;
 }
 }
 return -1;
 }
 }
 
 |