|
2 | 2 |
|
3 | 3 | /**
|
4 | 4 | * 154. Find Minimum in Rotated Sorted Array II
|
5 |
| - * |
6 |
| - * Follow up for "Find Minimum in Rotated Sorted Array": |
7 |
| - What if duplicates are allowed? |
8 | 5 |
|
9 |
| - Would this affect the run-time complexity? How and why? |
10 | 6 | Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
|
11 | 7 |
|
12 |
| - (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). |
| 8 | + (i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]). |
13 | 9 |
|
14 | 10 | Find the minimum element.
|
15 | 11 |
|
16 | 12 | The array may contain duplicates.
|
| 13 | +
|
| 14 | + Example 1: |
| 15 | + Input: [1,3,5] |
| 16 | + Output: 1 |
| 17 | +
|
| 18 | + Example 2: |
| 19 | + Input: [2,2,2,0,1] |
| 20 | + Output: 0 |
| 21 | +
|
| 22 | + Note: |
| 23 | + This is a follow up problem to Find Minimum in Rotated Sorted Array. |
| 24 | + Would allow duplicates affect the run-time complexity? How and why? |
| 25 | +
|
17 | 26 | */
|
18 | 27 | public class _154 {
|
| 28 | + public static class Solution1 { |
19 | 29 | public int findMin(int[] nums) {
|
20 |
| - int left = 0; |
21 |
| - int right = nums.length - 1; |
22 |
| - if (nums[left] < nums[right]) { |
23 |
| - return nums[left]; |
24 |
| - } |
25 |
| - int min = nums[0]; |
26 |
| - while (left + 1 < right) { |
27 |
| - int mid = left + (right - left) / 2; |
28 |
| - min = Math.min(min, nums[mid]); |
29 |
| - if (nums[mid] > nums[left]) { |
30 |
| - min = Math.min(nums[left], min); |
31 |
| - left = mid + 1; |
32 |
| - } else if (nums[mid] < nums[left]) { |
33 |
| - right = mid - 1; |
34 |
| - } else { |
35 |
| - left++; |
36 |
| - } |
| 30 | + int left = 0; |
| 31 | + int right = nums.length - 1; |
| 32 | + if (nums[left] < nums[right]) { |
| 33 | + return nums[left]; |
| 34 | + } |
| 35 | + int min = nums[0]; |
| 36 | + while (left + 1 < right) { |
| 37 | + int mid = left + (right - left) / 2; |
| 38 | + min = Math.min(min, nums[mid]); |
| 39 | + if (nums[mid] > nums[left]) { |
| 40 | + min = Math.min(nums[left], min); |
| 41 | + left = mid + 1; |
| 42 | + } else if (nums[mid] < nums[left]) { |
| 43 | + right = mid - 1; |
| 44 | + } else { |
| 45 | + left++; |
37 | 46 | }
|
38 |
| - min = Math.min(min, Math.min(nums[left], nums[right])); |
39 |
| - return min; |
| 47 | + } |
| 48 | + min = Math.min(min, Math.min(nums[left], nums[right])); |
| 49 | + return min; |
40 | 50 | }
|
| 51 | + } |
41 | 52 | }
|
0 commit comments