旋转数组的最小数字
2015-08-21 17:09
375 查看
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。#include <iostream> using namespace std; int midInOrder( int *arr,int low,int high) { int min=arr[low]; for(int i=low; i < high; i++) if(arr[i] < min) min = arr[i]; return min; } int Min(int* arr, int length) { if(arr == NULL || length <=0) throw exception("Invalid input"); int low = 0; int high = length-1; int mid = low; while(arr[low] >= arr[high]) { if(high - low == 1) return arr[high]; mid = (low + high)/2; if(arr[low] == arr[mid] && arr[high] == arr[mid]) return midInOrder(arr,low,high); if(arr[low] >= arr[mid]) high = mid; else low = mid; } return arr[mid]; }
// ====================测试代码==================== void Test(int* numbers, int length, int expected) { int result = 0; try { result = Min(numbers, length); for(int i = 0; i < length; ++i) printf("%d ", numbers[i]); if(result == expected) printf("\tpassed\n"); else printf("\tfailed\n"); } catch (...) { if(numbers == NULL) printf("Test passed.\n"); else printf("Test failed.\n"); } } int main(int argc, char* argv[]) { // 典型输入,单调升序的数组的一个旋转 int array1[] = {3, 4, 5, 1, 2}; Test(array1, sizeof(array1) / sizeof(int), 1); // 有重复数字,并且重复的数字刚好的最小的数字 int array2[] = {3, 4, 5, 1, 1, 2}; Test(array2, sizeof(array2) / sizeof(int), 1); // 有重复数字,但重复的数字不是第一个数字和最后一个数字 int array3[] = {3, 4, 5, 1, 2, 2}; Test(array3, sizeof(array3) / sizeof(int), 1); // 有重复的数字,并且重复的数字刚好是第一个数字和最后一个数字 int array4[] = {1, 0, 1, 1, 1}; Test(array4, sizeof(array4) / sizeof(int), 0); // 单调升序数组,旋转0个元素,也就是单调升序数组本身 int array5[] = {1, 2, 3, 4, 5}; Test(array5, sizeof(array5) / sizeof(int), 1); // 数组中只有一个数字 int array6[] = {2}; Test(array6, sizeof(array6) / sizeof(int), 2); // 输入NULL Test(NULL, 0, 0); return 0; }
相关文章推荐
- 线程的同步互斥之事件对象(Event)
- 单一控制器实现员工信息管理
- qt编译mysql驱动插件
- Android 自动注释,导入模板文件
- Linux 自学命令
- 产品新人应该学会的几点坚持
- 编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过
- 树状数组详细分析
- Delphi_OD_代码_调试_Delphi反调试技术(以OD为例附核心原代码)
- 对比两个实体类属性值的差异
- 探索static——不需要能够使用该类实例?
- 直接插入排序
- AndroidManifest.xml
- tcpkill清除异常tcp连接
- Open vSwitch安装及配置
- keepalived+nginx反向代理访问后端web服务器
- C++的引用语法
- android TextView中文字通过SpannableString设置属性
- 关于对初学者ps合成工具使用的问答
- 有一个类为ClassA,有一个类为ClassB,在ClassB中有一个方法b,此方法抛出异常,在ClassA类中有一个方法a,请在这个方法中调用b,然后抛出异常。在客户端有一个类为TestC,有一个方