自己代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int n,label,label_left,label_right,start,end,len;
n=nums.size();
start=0;
end=n-1;
while(1)
{
len=end-start+1;
if(len>2)
{ if(len%2==0)
{ label_left=(len/2)-1;
label_right=len/2;
if(nums[start+label_left]!=target && nums[start+label_right]!=target)
{ if(nums[start+label_left]>target)
end=start+label_left-1;
else
start=start+label_right+1;
}else
{
if (nums[start+label_left]==target)
{
return start+label_left;
}
else
{
return start+label_right;
}
}
}
if (len%2==1)
{ label=len/2;
if(nums[start+label]!=target)
{ if (nums[start+label]>target)
end=start+label-1;
else
start=start+label+1;
}else
{
return start+label;
}
}
}else
{
if(nums[start]==target)
{
return start;
}
if(nums[end]==target)
{
return end;
}
return -1;
}
}
}
};
总结:
1、可以不需要分奇偶,简化代码,只是偶数时,对半分一边会比另外一边多一个数。
2、看完解析后,知道了end=start+label_left-1与end=start+label-1中的减1是右区间开闭、包不包含的关系,此处自己是右闭。
3、求的位置都是相对于坐标原点的位置,即相对于数组nums[0]的位置,不要忘了新的end,start都要加上上一次的start。if判断条件中的nums也要记得加上start,即相对于数组nums[0]的位置。