旋转数组的最小数字



题目分析:

1.首先是有序数组,最小数字刚好是两个子数组的分界线,所以用二分查找

2.先判断数组是否为空,是则抛异常

3.设置俩指针,若p1所指大于p2,才说明有旋转,中值和它俩比较:

①都相等没法判断,需要用顺序查找。

②小于p1小于p2则说明是后边子数组的

③大于p1大于p2则说明是前边子数组的。



#include "stdafx.h"  
#include<iostream>  
using namespace std;  

int MinInOrder(int arr[], int low,int high)
{
	int temp = arr[low];
	for(int i = low + 1;i != high; i++)
	{
		if(temp > arr[i])
		temp = arr[i];
	}
	return temp;
}
  
int binSearch(int arr[],int length)  
{  
	if(arr == NULL || length <= 0)
		throw new std::exception("Invalid parameters");//如果数组为空,则抛出异常

   int low = 0,high = length-1;
   int mid = low;
   while(arr[low] > arr[high])//说明数组有旋转
   {
	if(high - low == 1)//如果两个指针挨着,则第二个指针指的是最小的数
	{
		mid = high;
		break;
	}
   mid = (low + high )/2;
   //如果两个指针和中值所指的数都是一样如1 1 1 0 1这种,则需要用顺序查找
   if(arr[low] == arr[high] && arr[high] == arr[mid])
	   return MinInOrder(arr,low,high);
   if(arr[low] < arr[mid])//中值大于前边的,属于第一阵列,low指针指向mid
	   low = mid;
   else if(arr[mid] < arr[high])//中值小于后边的,属于第二阵列,high指针指向mid
	   high = mid;
   }
   return arr[mid];
}


int main()  
{  
    int arr[100] = {0};  
    int n = 0 ,i = 0;  
    cout << "输入数字个数:"<< endl;  
    cin >> n ;  
    int len = n;  
    while(n--)  
    {  
    cin >> arr[i];  
    i++;  
    }  
	cout << "最小的数是:" << binSearch(arr,len) << endl;
    system("pause");  
    return 0;  
}  


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值