一. 问题描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。
编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。
示例 1:
输入: nums = [2,5,6,0,0,1,2], target = 0
输出: true
示例 2:
输入: nums = [2,5,6,0,0,1,2], target = 3
输出: false
进阶:
这是 搜索旋转排序数组 的延伸题目,本题中的 nums 可能包含重复元素。
这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?
二. 解题思路
解题思路:本题首先找到旋转点point,然后再进行二分查找。
步骤一:通过遍历数组找到旋转点point,判断target在point点左边还是右边。
步骤二:如果point在左边,则对左边进行二分查找。否则对右边进行二分查找。
注意:这一题的关键点是各种特殊情况需要考虑到.
三. 执行结果
执行用时 :1 ms, 在所有 java 提交中击败了99.84%的用户
内存消耗 :39.8 MB, 在所有 java 提交中击败了10.42%的用户
四. Java代码
class Solution { public boolean search(int[] nums, int target) { if(nums.length<=0||nums==null) { return false; } int point=0; for(int i=0;i<nums.length-1;i++) { if(nums[i]>nums[i+1]) { point=i+1; break; } } //利用二分查找,找值 int first=0; int second=nums.length-1; if(point>0) { if(target<=nums[point-1]&&target>=nums[0]) { second=point-1; }else if(target<=nums[0]&&target>=nums[point]) { first=point; }else { return false; } } //二分查找代码 do{ if(target==nums[first]||target==nums[second]) { return true; } int m=(first+second)/2; if(nums[m]==target) { return true; }else { if(nums[m]>target&&m>0) { second=m-1; }else { first=m+1; } } }while(second>first); return false; } }