题目:给定一旋转数组和一整数,判断整数是否在该数组中。旋转数组的定义就是,把数组开始部分的若干个元素移到数组最后。此题假设数组中没有重复元素。
思路:之前写的判断情况特别复杂,然后还出错。看了网上题解,这样想就可以了:通过判断mid元素的大小,得知是mid左边的序列有序还是右边的序列有序。每次将target元素和有序的序列首尾元素比较,若在该有序序列中,则移动相应指针使得在该序列中查找;否则,target元素在另一序列中,移动相应指针。
需要注意的是,不管你用左闭右开区间,还是闭区间,你需要维护这个特性。在使用左闭右开区间时,取尾元素时记得-1,为nums[last-1]。
相关:剑指offer中有类似的一题,是求旋转数组的最小值。两者思路不是很一样。求最小值时,是维护两个指针P1和P2,P1始终指向第一个递增序列,P2始终指向第二个递增序列,通过mid元素与首尾元素比较,移动P1或P2指针。最终P1和P2相邻时,P2即指向最小值。等等。。
class Solution { public: int search(vector<int>& nums, int target) { int first=0; int last=nums.size(); while(first<last) { int mid=first+(last-first)/2; if(nums[mid]==target) return mid; if(nums[first]<nums[mid]) {//左边有序 if(nums[first]<=target && target<=nums[mid]) last=mid; else first=mid+1; } else {//右边有序 if(nums[mid]<=target && target<=nums[last-1])//既然是左闭右开区间,这里就应该是last-1 first=mid+1; else last=mid; } } return -1; } };