旋转数组求某个值:今日头条面试题--二分法

来源:互联网 发布:python有哪些图形库 编辑:程序博客网 时间:2024/05/22 15:16

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

Subscribe to see which companies asked this question.

class Solution {public:    int search(vector<int>& nums, int target) {        int left=0,right=nums.size()-1;        while(left<=right){                        if(right-left<=1){ //我这种判断边界的方法非常暴力无脑,我喜欢。                if(nums[right]==target) return right;                else if(nums[left]==target) return left;            }            int mid=(left+right)/2;            if(nums[mid]==target)                return mid;            else if(nums[mid]>=nums[right]){                if(nums[mid]>=target&&target>=nums[left])                    right=mid-1;                else                    left=mid+1;            }else{                if(nums[mid]<=target&&target<=nums[right])                    left=mid+1;                else                    right=mid-1;            }        }        return -1;    }};

如果有重复的咋办呢?直接把right--就可以了,直到没有找到重复的为止。
class Solution {public:    int search(vector<int>& nums, int target) {        int left=0,right=nums.size()-1;        while(left<=right){                        if(right-left<=1){                if(nums[right]==target) return right;                else if(nums[left]==target) return left;            }            int mid=(left+right)/2;            if(nums[mid]==target)                return true;            else if(nums[mid]>nums[right]){                if(nums[mid]>=target&&target>=nums[left])                    right=mid-1;                else                    left=mid+1;            }else if(nums[mid]<nums[right]){                if(nums[mid]<=target&&target<=nums[right])                    left=mid+1;                else                    right=mid-1;            }else{                --right;            }        }        return false;    }};



0 0