剑指offer 8 - 旋转数组的最小数字
来源:互联网 发布:网络ssc什么意思 编辑:程序博客网 时间:2024/06/05 14:19
{3,4,5,1,2},比如此处被分为{3,4,5}{1,2}这样连个数组,找中间元素,让其跟元素首元素比较,如果大于首元素,则中间元素属于前半段有序数组,如果小于尾元素,那么中间元素就是后半段的元素。
设定两个指针start和end分别指向数组的首尾元素,然后当start指向前半段最后一个元素,end指向后半段第一个元素,这是程序就找到了数组中的最小元素,就是end指向的那个数,程序的出口就是 end-start==1。
注意: 若数组未旋转,则a[0]<a[length-1], 直接返回a[0]为最小值
若{1,0,1,1,1}和{1,1,1,0,1},遇到首尾和中间元素相等,则直接采用顺序查找的方法。
</pre><pre>
#include<iostream>using namespace std;#include<time.h>int Min(int *a,int length){ if(a==NULL || length<=0)throw new std::exception("invalid parameraters"); int p1=0; int p2=length-1; int mid=p1; while(a[p1]>=a[p2]) { if((p2-p1)==1) return a[p2]; mid=(p1+p2)/2; if(a[mid]==a[p1] && a[mid]==a[p2]) { int min= a[p1]; for(int i=p1+1;i<p2;i++) { if(a[i]<min) min = a[i]; } return min; } if(a[mid]>=a[p1]) p1=mid; else if(a[mid]<=a[p2]) p2=mid; } return a[p1];}// ====================测试代码====================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;}
0 0
- 【剑指offer】旋转数组的最小数字
- 剑指offer--旋转数组的最小数字
- 剑指offer--旋转数组的最小数字
- 剑指offer:旋转数组的最小数字
- 《剑指offer》旋转数组的最小数字
- 剑指 offer:旋转数组的最小数字
- 剑指offer-旋转数组的最小数字
- 剑指offer 旋转数组的最小数字
- 【剑指offer】旋转数组的最小数字
- 剑指offer 旋转数组的最小数字
- 剑指offer-旋转数组的最小数字
- 剑指Offer:旋转数组的最小数字
- 剑指Offer 旋转数组的最小数字
- 剑指offer|旋转数组的最小数字
- 剑指offer:旋转数组的最小数字
- 【剑指offer】旋转数组的最小数字
- 《剑指offer》旋转数组的最小数字
- 剑指Offer:旋转数组的最小数字
- 05快速排序
- 委托与接口之我看
- android ListView的分段显示、分页显示
- 为什么使用MAVEN 3.2.1会有版本问题?
- Linux下源码安装PyQt4
- 剑指offer 8 - 旋转数组的最小数字
- 可不可以在局域网编译TINY?
- user-agent概括
- Android 内存优化
- 在INSTALL TINY时出现下面的问题怎么办?
- wavein录音程序
- Unity3D游戏开发之使用Mecanim动画系统控制2D动画
- 转 Grand Central Dispatch 基础教程:Part 1/2 -swift
- Tiny对JDK有什么要求么?