diff --git a/FindMin.java b/FindMin.java new file mode 100644 index 00000000..7760f84f --- /dev/null +++ b/FindMin.java @@ -0,0 +1,25 @@ +class FindMin { + public int findMin(int[] nums) { + + int low = 0, high = nums.length - 1, mid; + + while(low <= high) { + mid = low + (high - low) / 2; + + if(nums[low] <= nums[high]) return nums[low]; + + if((mid == low || nums[mid] < nums[mid - 1]) + && (mid == high || nums[mid] < nums[mid + 1])) + return nums[mid]; + + if(nums[mid] >= nums[low]) { + low = mid + 1; + } else { + high = mid - 1; + } + + } + + return -1; + } +} \ No newline at end of file diff --git a/FindPeakElement.java b/FindPeakElement.java new file mode 100644 index 00000000..2178d087 --- /dev/null +++ b/FindPeakElement.java @@ -0,0 +1,19 @@ +class FindPeakElement { + public int findPeakElement(int[] nums) { + + int low = 0, high = nums.length - 1, mid; + + while(low <= high) { + mid = low + (high - low) / 2; + + if((mid == low || nums[mid] > nums[mid - 1]) && (mid == high || nums[mid] > nums[mid+1])) { + return mid; + } else if(nums[mid] < nums[mid + 1]) { + low = mid + 1; + } else { + high = mid - 1; + } + } + return -1; + } +} \ No newline at end of file diff --git a/SearchRange.java b/SearchRange.java new file mode 100644 index 00000000..8845e27d --- /dev/null +++ b/SearchRange.java @@ -0,0 +1,52 @@ +class SearchRange { + public int[] searchRange(int[] nums, int target) { + if(nums.length == 0 || target < nums[0] || target > nums[nums.length - 1]) return new int[]{-1,-1}; + int first = getFirstOccurance(nums, target, 0, nums.length - 1); + if(first == -1) return new int[]{-1,-1}; + + int last = getLastOccurance(nums, target, first, nums.length - 1); + return new int[] {first, last}; + } + + private int getFirstOccurance(int[] nums, int target, int low, int high) { + int mid; + + while(low <= high) { + mid = low + (high - low) / 2; + + if(nums[mid] == target) { + if(mid == low || nums[mid-1] != nums[mid]) { + return mid; + } else { + high = mid - 1; + } + } else if(nums[mid] > target) { + high = mid - 1; + } else { + low = mid + 1; + } + } + return -1; + } + + private int getLastOccurance(int[] nums, int target, int low, int high) { + int mid; + + while(low <= high) { + mid = low + (high - low) / 2; + + if(nums[mid] == target) { + if(mid == high || nums[mid+1] != nums[mid]) { + return mid; + } else { + low = mid + 1; + } + } else if(nums[mid] > target) { + high = mid - 1; + } else { + low = mid + 1; + } + } + return -1; + } +} \ No newline at end of file