#include<iostream>
#include"Solution.h"
using namespace std;
/*题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
*/
int main()
{
vector<int> sgg;
Solution s;
int a[537]=
{194,238,381,381,381,381,390,390,390,390,390,390,390,390,544,544,544,544,544,544,784,
1846,1847,1847,1850,1853,1853,1855,1856,1858,1859,1860,1861,1863,1863,1863,1865,1865
,1866,1868,1868,1871,1872,1872,1874,1875,1875,1879,1880,1881,1882,1884,1885,1887,1889,1890,
1890,1891,1893,1893,1896,1897,1897,1898,1899,1901,1903,1905,1906,1907,1907,1908,1908,1909,
1910,1912,1912,1914,1916,1916,1916,1916,1917,1918,1918,1920,1920,1921,1923,1923,1923,1923,
1924,1925,1925,1926,1930,1930,1930,1930,1933,1934,1934,1935,1935,1936,1938,1938,1941,1941,
1946,1948,1950,1950,1951,1951,1952,1952,1953,1953,1955,1957,1958,1958,1959,1959,1961,1961,
1963,1964,1966,1967,1968,1969,1977,1979,1980,1983,1983,1983,1986,1987,1991,1991,1991,1993,
1995,1995,1996,1998,1998,1999,2000,2001,2002,2003,2006,2006,2006,2007,2008,2009,2009,2009,
2009,2011,2012,2012,2013,2013,2013,2015,2015,2016,2020,2022,2024,2027,2028,2029,2029,2030,
2031,2031,2032,2033,2035,2036,2038,2039,2040,2040,2042,2042,2042,2043,2043,2043,2046,2048,
2049,2050,2052,2052,2052,2053,2054,2054,2056,2059,2061,2062,2063,2063,2063,2066,2069,2070,
2071,2073,2074,6336,6336,6336,6336,6336,6336,6342,6343,6344,6344,6344,6344,6344,6344,6344,
6344,6344,6828,6828,6828,6828,6828,8146,8146,8146,8146,8146,8146,6,6,6,6,6,6,6,6,6,7,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,10,11,11,
11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,
12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,15,16,16,16,18,
18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,
18,18,18,18,123,123,123,123,145,145,146,147,150,150,152,152,152,152,152,154,154,154,154,154,
154,154,154,154,154,154,154,154};
//int a[10]={1,1,1,1,1,1,1,1,1,1};
for(int i=0;i<537;i++)
sgg.push_back(a[i]);
cout<<s.minNumberInRotateArray(sgg);
return 0;
Solution.cpp
#include <iostream>
#include <vector>
#include "Solution.h"
using namespace std;
int Solution::minNumberInRotateArray(vector<int> rotateArray)
{
if(rotateArray.empty())
{
return 0;
}
vector<int>::iterator start=rotateArray.begin();
vector<int>::iterator end=rotateArray.end();
vector<int>::iterator mid=rotateArray.begin()+(end-start)/2;
if(*start< *(end-1))
{
return *start;
}
while(1)
{
if(*mid>*start)
{
//说明前面的元素比自己小则从前面到自己都是递增,则最小元素肯定在后半段即mid和end之间
while(*(mid+1)==*mid)
mid++;
if(*(mid+1)<*mid)
{
return *(mid+1);
}
start=mid+1;
mid=mid+(end-mid)/2;
}
/*6501,6828,6963,7036,7422,7674,8146,8468,8704,8717,9170,9359,9719,9895,9896,9913,9962,
154,293,334,492,1323,1479,1539,1727,1870,1943,2383,2392,2996,3282,3812,3903,4465,4605,4665,
4772,4828,5142,5437,5448,5668,5706,5725,6300,6335*/
else
{
//如果*mid<*start说明最小元素在mid与start之间,甚至就是自己
while(*(mid-1)==*mid)
mid--;
if(*(mid-1)>*mid)
{
return *mid;
}
else
{
end=mid-1;
mid=start+(mid-start)/2;
}
}
}
return 0;
}
Solution.h