文章目录
题目
思路
考虑到是非降序,可以很容易想到利用二分,但是这题中的数组是由两段非降序数组组成的,所以我们可以先对第一段非降序数组进行顺序遍历比较,直到 当前的数比下一个数大的情况,这时候说明过渡到第二段非降序数组中了,所以直接对第二段非降序数组进行二分搜索。
代码实现(Java)
class Solution {
public boolean search(int[] nums, int target) {
int len = nums.length, k = 0;
for(int i = 0; i<len-1; i++) {
if(nums[i] == target) {
//在第一段非降序数组中搜索到了,则直接返回true
return true;
} else {
//由于数组中可以存在重复值,所以这里 条件 为 > 而不是 >= ,提高搜索效率
if(nums[i] > nums[i+1]) {
k = i+1;
break;
}
}
}
return binarySearych(nums,target,k,len-1);
}
public boolean binarySearych(int[] nums,int target, int k, int len) {
int left = k, right = len;
while(left < right) {
int mid = (left+right)/2;
if(nums[mid] == target) {
return true;
} else if (nums[mid] > target) {
right--;
} else {
left++;
}
}
//最后还有一个 left == right 的情况,所以还需要比较 nums[left]与 target 的值比较
return nums[left] == target;
}
}
坚持分享,坚持原创,喜欢博主的靓仔靓女们可以看看博主的首页博客!
您的点赞与收藏是我分享博客的最大赞赏!
博主博客地址: https://blog.csdn.net/weixin_43967679