leetcode 0033
说明
只是为了记录一下,不求多快,也不深究。
会简要描述思路,代码中不写注释。
如碰到不会做的用了别人代码会在博客中标出。
题目描述
思路
题目要求时间复杂度是O(logn),就显然是用二分来做。
分两种情况讨论:第一段有序数个数多(大数多)和第二段有序数个数多(小数多);
-
大数多
- 若target小于nums[start],则target肯定在后半段,start := mid;
- 若target大于nums[start],则比较target和nums[mid],大于nums[mid],在后半段,start := mid;小于nums[mid],在前半段,end := mid;
- 若target等于nums[start],返回start;
-
小数多
-
若target大于nums[start],则target肯定在前半段,end := mid;
-
若target小于nums[start],则比较target和nums[mid],大于nums[mid],在后半段,start := mid;小于nums[mid],在前半段,end := mid;
-
若target等于nums[start],返回start;
-
class Solution {
public int search(int[] nums, int target) {
if (nums.length == 0) {
return -1;
}
if (nums.length == 1) {
return nums[0] == target ? 0 : -1;
}
int start = 0, end = nums.length - 1;
while (start < end) {
int mid = (start + end) / 2;
boolean isBigMore = nums[mid] > nums[start] ? true : false;
if (isBigMore) {
if (target < nums[start]) {
start = mid;
} else if (target > nums[start]) {
if (target > nums[mid]) {
start = mid;
} else if (target < nums[mid]) {
end = mid;
} else {
return mid;
}
} else {
return start;
}
} else {
if (target > nums[start]) {
end = mid;
} else if (target < nums[start]) {
if (target > nums[mid]) {
start = mid;
} else if (target < nums[mid]) {
end = mid;
} else {
return mid;
}
} else {
return start;
}
}
}
return target == nums[start + 1] ? start + 1 : -1;
}
}