64 lines
1.5 KiB
Java
64 lines
1.5 KiB
Java
/*
|
|
* @lc app=leetcode id=33 lang=java
|
|
*
|
|
* [33] Search in Rotated Sorted Array
|
|
*/
|
|
|
|
// @lc code=start
|
|
class Solution {
|
|
public int search(int[] nums, int target) {
|
|
if(nums == null ||nums.length == 0) {
|
|
return -1;
|
|
}
|
|
int r;
|
|
if(target >= nums[0]) {
|
|
// find in ascending side
|
|
r = searchInAscendingSide(nums, target);
|
|
} else {
|
|
// find in descending side
|
|
r = searchInDescendingSide(nums, target);
|
|
}
|
|
return r;
|
|
}
|
|
|
|
private int searchInAscendingSide(int[] nums, int target) {
|
|
int l = 0, r = nums.length-1, m;
|
|
while(l<=r) {
|
|
m = l + (r-l)/2;
|
|
if(nums[m] == target) {
|
|
return m;
|
|
} else if(!isAscendingSide(m, nums)) {
|
|
r = m -1;
|
|
} else if(nums[m] < target) {
|
|
l = m + 1;
|
|
} else {
|
|
r = m -1;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
private int searchInDescendingSide(int[] nums, int target) {
|
|
int l = 0, r = nums.length-1, m;
|
|
while(l <= r) {
|
|
m = l + (r-l)/2;
|
|
if(nums[m] == target) {
|
|
return m;
|
|
} else if(isAscendingSide(m, nums)) {
|
|
l = m + 1;
|
|
} else if(nums[m] < target) {
|
|
l = m + 1;
|
|
} else {
|
|
r = m - 1;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
private boolean isAscendingSide(int i, int[] nums) {
|
|
return nums[i]>=nums[0];
|
|
}
|
|
}
|
|
// @lc code=end
|
|
|