我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/description/
题目描述:
知识点:二分搜索法
思路:在二分搜索的基础上要额外判断nums[left]和nums[mid]值的大小关系
首先设立left指针指向数组中第一个元素,right指针指向数组中最后一个元素,只要满足left <= right,就一直进行以下循环。
(1)如果target的值比nums[left]要大,
a.如果target的值比nums[mid]要大,
a-1.nums[mid]的值大于等于nums[left]的值,我们应该在右侧寻找,令left = mid + 1。
a-2.nums[mid]的值小于nums[left]的值,我们应该在左侧寻找,令right = mid - 1。
b.如果target的值和nums[mid]相等,直接返回mid。
c.如果target的值比nums[mid]要小,我们应该在左侧寻找,令right = mid - 1。
(2)如果target的值和nums[left]相等,直接返回left。
(3)如果target的值比nums[left]要小,
a.如果target的值比nums[mid]要大,我们应该在右侧寻找,令left = mid + 1。
b.如果target的值和nums[mid]相等,直接返回mid。
c.如果target的值比nums[mid]要小,
c-1.如果nums[mid]的值大于等于nums[left]的值,我们应该在右侧寻找,令left = mid + 1。
c-2.如果nums[mid]的值小于nums[left]的值,我们应该在左侧寻找,令right = mid - 1。
如果循环结束后还没找到,直接返回-1。
这个方法本质上就是在二分搜索的基础上多加了几个判断语句而已,因此其时间复杂度是O(logn)级别的,其中n为nums数组的长度。算法没有使用任何额外的辅助空间,空间复杂度是O(1)。
JAVA代码:
public class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while(left <= right) {
int mid = left + (right - left) / 2;
if(target > nums[left]) {
if(target > nums[mid]) {
if(nums[mid] >= nums[left]) {
left = mid + 1;
}else {
right = mid - 1;
}
}else if(target == nums[mid]) {
return mid;
}else {
right = mid - 1;
}
}else if(target == nums[left]) {
return left;
}else {
if(target > nums[mid]) {
left = mid + 1;
}else if(target == nums[mid]) {
return mid;
}else {
if(nums[mid] >= nums[left]) {
left = mid + 1;
}else {
right = mid - 1;
}
}
}
}
return -1;
}
}
LeetCode解题报告: