记录在旋转数组中找到目标值(不含重复元素)

思路:

1.是先考虑mid和left的关系,如下

     可以根据 nums[mid] 和 nums[left] 判断,因为我们的 mid 一定是会落在 left 和 right 之间,那如果 nums[mid] >= nums[left] 时,说明他俩落在一个数组里了,如果 nums[mid] < nums[left] 时,说明他俩落在了不同的数组,此时left 在数组1 mid在数组2.

注:left 和 mid 落在同一数组时,不能是 left 在 数组2 ,mid 在 数组1 呢?因为咱们的 mid 是通过 left 和 right 的下标求得,所以应该在 left 和 right 中间

2.考虑完了mid和left再考虑target和nums【mid】的大小,然后来决定left和right哪一个来移动

   两种情况

1.落在 mid 的左边,也就是 target >= nums[left] && target < nums[mid],此时我们让 right = mid -1,让 left 和 right 都落到数组 1 中,下次查找我们就是在数组1中进行了,完全有序,

2.落在 mid 的右边,也就是target > nums[mid] || target < nums[left] 此时我们让 left = mid + 1即可,也是为了慢慢将left 和 right 指针赶到一个有序数组内。

那我们在来思考一下当 mid 值落在 数组2 中时,target 会有几种情况呢?其实和上面的例子思路一致,情况相反而已

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[mid]){
    return mid;
}

//left和mid落在同一数组的情况(就是靠mid和left比较大小来判断mid在哪个区间),同时落在数组1 或 数组2
if(nums[mid]>nums[left]){//大情况一:这是在一区间,然后比较nums【mid】和target来决定left和right谁移动

     //小情况一:target 落在 left 和 mid 之间,则移动我们的right,完全有序的一个区间内查找
     if(target<nums[mid]&&target>=nums[left]){
         right=mid-1;

     // 小情况二:target 落在 mid 和right之间,有可能在数组1, 也有可能在数组2    
     }else if(target>nums[mid]||target<nums[left]){
left=mid+1;
        

     }
}else if(nums[mid]<nums[left]){//大情况二;mid在二区间去了,然后比较nums【mid】和target来决定left和right谁移动
//小情况一:有序的一段区间,target 在 mid 和 right 之间
if(target>nums[mid]&&target<=nums[right]){
    left=mid+1;

//小情况二:两种情况,target 在left 和 mid 之间,有可能在数组1, 也有可能在数组2  
}else if(target<nums[mid]||target>nums[left]){
    right=mid-1;

}
}



    }
return -1;
    }
}
全部评论

相关推荐

shtdbb_:还不错,没有让你做了笔试再挂你
点赞 评论 收藏
分享
11-08 17:36
诺瓦科技_HR
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务