# Search for a Range ###### tags: `Medium` >question : https://leetcode.com/explore/interview/card/top-interview-questions-medium/110/sorting-and-searching/802/ >reference : [Binary Search](https://medium.com/appworks-school/binary-search-%E9%82%A3%E4%BA%9B%E8%97%8F%E5%9C%A8%E7%B4%B0%E7%AF%80%E8%A3%A1%E7%9A%84%E9%AD%94%E9%AC%BC-%E4%B8%80-%E5%9F%BA%E7%A4%8E%E4%BB%8B%E7%B4%B9-dd2cd804aee1) >related problem : ## My Solution ```java= class Solution { public int[] searchRange(int[] nums, int target) { if(nums.length == 0) { int[] ans = {-1,-1}; return ans; } int l = 0; int r = nums.length - 1; int index = 0; while(l <= r) { // avoid integer overflow // int mid = (l + r) / 2; int mid = l + (r - l) / 2; if(nums[mid] > target) r = mid - 1; else if(nums[mid] < target) l = mid + 1; else { index = mid; break; } } if(nums.length == 0 || nums[index] != target) { int[] ans = {-1,-1}; return ans; } l = index; r = index; while(l - 1 >= 0 && nums[l - 1] == target) l--; while(r + 1 < nums.length && nums[r + 1] == target) r++; int[] ans = {l, r}; return ans; } } ``` ## Other Solution ```java= class Solution { public int[] searchRange(int[] nums, int target) { int[] result = new int[2]; result[0] = findFirst(nums,target); result[1] = findLast(nums,target); return result; } public int findFirst(int[] nums, int target){ int result = -1; int low = 0; int high = nums.length - 1; while(low <= high){ int mid = low + ((high-low)/2); if (nums[mid] < target){ low = mid +1; } else if (nums[mid] > target){ high = mid - 1; } else { // nums[mid] == target result = mid; // Because nothing after mid // can be the first occurance of target. // Maybe mid is the first occurance, maybe not. // So let's narrow the target for [0...mid-1] and find out high = mid - 1; } } return result; } public int findLast(int[] nums, int target){ int result = -1; int low = 0; int high = nums.length - 1; while(low <= high){ int mid = low + (high-low)/2; if (nums[mid] < target){ low = mid +1; } else if (nums[mid] > target){ high = mid - 1; } else { // nums[mid] == target result = mid; // because nothing before mid // can be the last occurance of target. // maybe mid is the last occurance , maybe not // so let's narrow the target for [mid+1...high] and find out low = mid + 1; } } return result; } } ```