剑指offer——)旋转数组的最小数字

#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
#include <iostream>
#include <vector>
using namespace std;
#ifndef HH_K
#define HH_K

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray);
};


#endif



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寰宇的行者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值