最直接的办法是直接循环,挨着比就完了
简单版(c++实现)
class Solution {
public:
int search(vector<int>& nums, int target) {
for (int i = 0; i < nums.size(); i ++) {
if (nums[i] == target) // 找到直接返回
return i;
}
return -1; // 未找到 返回-1
}
};
简单易懂
优化版(c++版本)
class Solution {
public:
// 找到旋转点 K
int getK(vector<int> nums){
for(int i=0; i<nums.size()-1; i++){
if(nums[i+1] < nums[i]){
return i+1;
}
}
return 0;
}
int search(vector<int>& nums, int target) {
// write code here
int k = getK(nums);
int start, end;
if(k == 0){ //若K是0,则没旋转,从头到尾升序排列
start=0; end=nums.size()-1;
}else{ //K不是0的话,start和end指向最小值和最大值
start=k; end=k-1;
}
if(target < nums[start] || target > nums[end]){
return -1; //比最小值小,或者比最大值大,直接返回-1
}else{
int i;
if(k!=0){ //K不是0的话,要确定是从下标0开始比还是从下标K开始比
if(target >= nums[0]){ //比下标0的数字大,就比前半段,即[0, k-1]
start=0; end=k-1;
}else{
start=k; end=nums.size()-1; //比下标0的数字小,就比后半段,即[k, end]
}
}
//确定了比较区域,挨着比就行了
for(i=start; i<=end; i++){
if(nums[i] == target) return i; //遇到一样的返回目标下标
}
return -1; //如果到最后都没有,返回-1
}
}
};
思路比较简单,找到K,就可以判断比较区间。
找到了比较区间后,挨着比就可以了。