zoukankan      html  css  js  c++  java
  • 剑指Offer06 旋转数组的最小值

     1 /*************************************************************************
     2     > File Name: 06_MinNumberInRotatedArray.c
     3     > Author: Juntaran
     4     > Mail: JuntaranMail@gmail.com
     5     > Created Time: 2016年08月29日 星期一 20时14分22秒
     6  ************************************************************************/
     7 
     8 #include <stdio.h>
     9 #include <stdlib.h>
    10 
    11 // O(n)解法
    12 int minNumberInRotatedArray1(int* rotatedArray, int length)
    13 {
    14     if (length <= 0)
    15         return 0;
    16     
    17     for (int i = 1; i < length; ++i)
    18     {
    19         if ( rotatedArray[i] < rotatedArray[i-1])
    20             return rotatedArray[i];
    21     }
    22     return rotatedArray[0];
    23 }
    24 
    25 // O(log(n))解法
    26 int minNumberInRotatedArray2(int* rotatedArray, int length)
    27 {
    28     if (length <= 0)
    29         return 0;
    30     if (length == 1)
    31         return rotatedArray[0];
    32     int left  = 0;
    33     int right = length - 1;
    34     int middle = 0;
    35     
    36     if (rotatedArray[left] < rotatedArray[right])
    37         return rotatedArray[0];
    38     
    39     while (rotatedArray[left] >= rotatedArray[right])
    40     {
    41         if (right - left == 1)
    42         {
    43             middle = right;
    44             break;
    45         }
    46         middle = (left + right) / 2;
    47         
    48         // 如果left、right、middle的值相同,只能顺序查找
    49         if (rotatedArray[left]==rotatedArray[middle] 
    50         && rotatedArray[middle]==rotatedArray[right])
    51         {
    52             for (int i = left+1; i < right; ++i)
    53             {
    54                 if (rotatedArray[i] < rotatedArray[i-1])
    55                     return rotatedArray[i];
    56             }
    57             return rotatedArray[left];
    58         }
    59         
    60         if (rotatedArray[middle] >= rotatedArray[left])
    61             left = middle;
    62         else if (rotatedArray[middle] <= rotatedArray[right])
    63             right = middle;
    64     }
    65     return rotatedArray[middle];
    66 }
    67 
    68 int main()
    69 {
    70     int rotatedArray1[] = {1,1,1,1,1,1,1};
    71     int rotatedArray2[] = {7,8,9,9,9,1,2};
    72     int rotatedArray3[] = {8,1,2,3,4,5,6};
    73     int rotatedArray4[] = {8,9,1,2,8,8,8,8,8,8};
    74     
    75     int length1 = 7;
    76     int length2 = 10;
    77     
    78     int ret1, ret2;
    79     
    80     ret1 = minNumberInRotatedArray1(rotatedArray1, length1);
    81     ret2 = minNumberInRotatedArray2(rotatedArray1, length1);
    82     printf("ret1 is %d, ret2 is %d
    ", ret1, ret2);
    83     ret1 = minNumberInRotatedArray1(rotatedArray2, length1);
    84     ret2 = minNumberInRotatedArray2(rotatedArray2, length1);
    85     printf("ret1 is %d, ret2 is %d
    ", ret1, ret2);
    86     ret1 = minNumberInRotatedArray1(rotatedArray3, length1);
    87     ret2 = minNumberInRotatedArray2(rotatedArray3, length1);
    88     printf("ret1 is %d, ret2 is %d
    ", ret1, ret2);
    89     ret1 = minNumberInRotatedArray1(rotatedArray4, length2);
    90     ret2 = minNumberInRotatedArray2(rotatedArray4, length2);
    91     printf("ret1 is %d, ret2 is %d
    ", ret1, ret2);
    92     
    93     return 0;
    94 }
  • 相关阅读:
    bzoj4358: permu
    bzoj4636: 蒟蒻的数列
    bzoj4229: 选择
    bzoj4561: [JLoi2016]圆的异或并
    bzoj2618: [Cqoi2006]凸多边形
    bzoj1803: Spoj1487 Query on a tree III
    bzoj2467: [中山市选2010]生成树
    PostgreSQL服务器存储参数的内部查看方法和实际表述之间的关系
    PostgreSQL 系统表
    PostgreSQL环境中查看SQL执行计划示例
  • 原文地址:https://www.cnblogs.com/Juntaran/p/5819494.html
Copyright © 2011-2022 走看看