题目:如标题
例子:{2,2,4,3,3,3,0},测试了别的也OK
left 和right 是为了找到他左右两边第一个和它不等的数,注意不要下标溢出
在判断nums[mid]处于非递减还是非递增还是最大的时候一定要注意等号,因为可能一个不小心就跑到break那里去了。。。
因为在边界的时候 nums[left]=nums[mid],或nums[right]=nums[mid]
#include<iostream>
#include<vector>
using namespace std;
class Solution
{
public:
int maxnum(vector<int> nums)
{
int i=0;
int j=nums.size()-1;
int res;
while(i<=j)//带“=”“=”“=” 带“=”“=”“=” 带“=”“=”“=”
{
int mid=(i+j)/2;
int left=mid;
while(nums[left]==nums[mid] && left >0)
{
left--;
}
int right=mid;
while(nums[right]==nums[mid] && right<nums.size()-1)
{
right++;
}
if(nums[mid]>=nums[left]&&nums[mid]<=nums[right])//在左边数组,升序 ,带“=”“=”“=” 带“=”“=”“=”
{
i=right;
}
else if(nums[mid]<=nums[left]&&nums[mid]>=nums[right])//在右边数组,降序 带“=”“=”“=” 带“=”“=”“=”
{
j=left;
}
else
{
res=nums[mid];
return res;
break;
}
}
}
};
int main()
{
vector<int> tems;
int a;
for(int i=0;i<5;i++)
{
cin>>a;
tems.push_back(a);
}
Solution so;
cout<<so.maxnum(tems);
}