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 }
  • 相关阅读:
    LINQ学习系列-----1.3 扩展方法
    表单重复提交的三种情况及解决办法
    JDBC的简单封装
    Java学习路线图
    成为一名Java高级工程师你需要学什么
    站在烦恼里仰望幸福
    如何发布Web项目到互联网
    用户管理的设计--2.新增用户信息实现
    MD5加密工具
    springMvc注解之@ResponseBody和@RequestBody
  • 原文地址:https://www.cnblogs.com/silentNight/p/5456541.html
Copyright © 2011-2022 走看看