zoukankan      html  css  js  c++  java
  • 旋转数组求最小值

    看的网上有个叫做旋转数组的东西,所以查了查.所谓旋转数组就是把一个有序数组转动n位得到的一个东西.例如下图旋转后的a数组

    一共查到了两个问题

    1.把一个有序数组按照一个长度,旋转 m.获得一个旋转数组     http://blog.csdn.net/lalor/article/details/7961323      这个帖子没看明白c++的rotate怎么就高效了???

    2.旋转数组求最小值      http://zhedahht.blog.163.com/blog/static/25411174200952765120546/

    试着写了一下用二分法求最小值的代码, 没有保证一次成功,编译后通过了.但是总有种食之无味,弃之可惜的感觉.....

     1 #include <iostream>
     2 #include <string.h>
     3 #include <stdio.h>
     4 
     5 using namespace std;
     6 
     7 int getMinist(const int* const sp, const int length)
     8 {
     9     int begin = 0;
    10     int end = length -1;
    11     int middle = (begin + end) / 2;
    12     
    13     for (int i = 0; i <= length; i++)  //当循环了length次都没结束的话,说明代码写错啦,否则不可能找不到
    14     {
    15         if (begin > end) //一直没找到,
    16         {
    17             return -2;
    18         }
    19         else  //只有sp[middle]的值比左边小(如果有),同时sp[middle]的值比右边小(如果有)
    20         {
    21             if ( (middle == 0) && (middle + 1 < length - 1) ) //middle在最左边
    22             {
    23                 if (sp[middle] < sp[middle+1])
    24                     return sp[middle];
    25             }
    26             else if ( (middle == length - 1) && (middle - 1 >= 0) ) //middle在最右边
    27             {
    28                 if (sp[middle] < sp[middle-1])
    29                     return sp[middle];
    30             }
    31             else //middle在中间
    32             {
    33                 if ( (sp[middle] < sp[middle-1]) && (sp[middle] < sp[middle+1]) )
    34                     return sp[middle];
    35             }
    36         }
    37         
    38         if ( sp[middle] >= sp[end] ) //sp[middle] 比最右边的大,就移动begin
    39         {
    40             begin = middle + 1;
    41         }
    42         else if (sp[middle] < sp[end]) //sp[middle] 比最左边大端小,就移动end
    43         {
    44             end = middle -1;
    45         }
    46         
    47         middle = (begin+end) / 2;
    48     }//for
    49     
    50     return -1;
    51 }
    52 
    53 int main(int argc, char** argv)
    54 {
    55     int arry1[] = {9,8,7,6,1,2,3,4,5,6};
    56     int arry2[] = {9,8,7,6,5,4,1,2,3};
    57     int arry3[] = {1,2,3,4};
    58     int arry4[] = {9,8,7,6,5,4,3,2,1};
    59     
    60     cout<<getMinist(arry1,sizeof(arry1)/sizeof(arry1[0]))<<endl;
    61     cout<<getMinist(arry2,sizeof(arry2)/sizeof(arry2[0]))<<endl;
    62     cout<<getMinist(arry3,sizeof(arry3)/sizeof(arry3[0]))<<endl;
    63     cout<<getMinist(arry4,sizeof(arry4)/sizeof(arry4[0]))<<endl;
    64     return 0;
    65 }
  • 相关阅读:
    Python中常见字符串去除空格的方法总结
    Python多版本pip安装库的问题
    报错No module named IPython的解决方法
    Win10家庭版如何启用本地组策略
    Oracle 11gR2新建空表不分配Segment
    Hadoop Balance
    Hive报错之java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonFactory
    Hive文件格式
    Hive报错之java.sql.SQLException: Field 'IS_STOREDASSUBDIRECTORIES' doesn't have a default value
    Oracle之Union与Union all的区别
  • 原文地址:https://www.cnblogs.com/silentNight/p/5456541.html
Copyright © 2011-2022 走看看