-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path81. Search in Rotated Sorted Array II.java
70 lines (56 loc) · 2.51 KB
/
81. Search in Rotated Sorted Array II.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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
There is an integer array nums sorted in non-decreasing order (not necessarily with distinct values).
Before being passed to your function, nums is rotated at an unknown pivot index k (0 <= k < nums.length) such that the resulting array is [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] (0-indexed). For example, [0,1,2,4,4,4,5,6,6,7] might be rotated at pivot index 5 and become [4,5,6,6,7,0,1,2,4,4].
Given the array nums after the rotation and an integer target, return true if target is in nums, or false if it is not in nums.
You must decrease the overall operation steps as much as possible.
Example 1:
Input: nums = [2,5,6,0,0,1,2], target = 0
Output: true
Example 2:
Input: nums = [2,5,6,0,0,1,2], target = 3
Output: false
*/
class Solution {
public boolean search(int[] nums, int target) {
int n = nums.length;
if (n == 0) return false;
int end = n - 1;
int start = 0;
while (start <= end) {
int mid = start + (end - start) / 2;
if (nums[mid] == target) {
return true;
}
if (!isBinarySearchHelpful(nums, start, nums[mid])) {
start++;
continue;
}
// which array does pivot belong to.
boolean pivotArray = existsInFirst(nums, start, nums[mid]);
// which array does target belong to.
boolean targetArray = existsInFirst(nums, start, target);
if (pivotArray ^ targetArray) { // If pivot and target exist in different sorted arrays, recall that xor is true when both operands are distinct
if (pivotArray) {
start = mid + 1; // pivot in the first, target in the second
} else {
end = mid - 1; // target in the first, pivot in the second
}
} else { // If pivot and target exist in same sorted array
if (nums[mid] < target) {
start = mid + 1;
} else {
end = mid - 1;
}
}
}
return false;
}
// returns true if we can reduce the search space in current binary search space
private boolean isBinarySearchHelpful(int[] arr, int start, int element) {
return arr[start] != element;
}
// returns true if element exists in first array, false if it exists in second
private boolean existsInFirst(int[] arr, int start, int element) {
return arr[start] <= element;
}
}