版权声明:版权所有,转载请注明原网址链接。 https://blog.csdn.net/qq_41231926/article/details/82955777
我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/description/
题目描述:
知识点:二分搜索法
思路:在二分搜索的基础上要额外判断nums[left]和nums[mid]值的大小关系
本题和LeetCode033——搜索旋转排序数组思路一致,但有一点差别,就是当nums[left]和nums[mid]相等时,我们的left和right索引该如何变化?
讨论如下两种情形:
(1)
上图中的绿色区域和蓝色区域的分界线代表的是旋转分界线。如果如上图所示中的情况有nums[left] == nums[mid],那么我们可以说middle ~ right位置的所有元素都和left相等。
(2)
而对于第二种情况,我们可以说left ~ middle位置的所有元素都和left相等。
我们就根据left ~ middle位置的所有元素是否均和left相等,来判断是(1)中的情形,还是(2)中的情形。
时间复杂度是O(nlogn),其中n为nums数组的长度。空间复杂度是O(1)。
JAVA代码:
public class Solution {
public boolean 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]){
return true;
}else if(target < nums[left]){
if(target == nums[mid]){
return true;
}else if(target < nums[mid]){
int[] leftRight = search(nums, left, mid, right, target);
left = leftRight[0];
right = leftRight[1];
}else{
left = mid + 1;
}
}else{
if(target == nums[mid]){
return true;
}else if(target < nums[mid]){
right = mid - 1;
}else{
int[] leftRight = search(nums, left, mid, right, target);
left = leftRight[0];
right = leftRight[1];
}
}
}
return false;
}
private int[] search(int[] nums, int left, int mid, int right, int target){
if(nums[mid] > nums[left]) {
left = mid + 1;
}else if(nums[mid] < nums[left]){
right = mid - 1;
}else{
int i = left;
for (; i <= mid; i++) {
if(nums[i] != nums[mid]){
break;
}
}
if(i <= mid){
right = mid - 1;
}else{
left = mid + 1;
}
}
int[] result = new int[2];
result[0] = left;
result[1] = right;
return result;
}
}
LeetCode解题报告: