zoukankan      html  css  js  c++  java
  • 剑指offer-8.旋转数组的最小数字

    0 题目

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 

    1 分析

    首先需要找到旋转数组的开始位置。

    该数组可以分为两部分,两部分都是已经排序的了。

    如果使用二分,那么当arr[start]>arr[end]那么就应该在这个缺件,因为,原始数组是递增的,因此,应该是arr[start]<arr[end]。

    当相同的情况时,就只能从头开始遍历了。

    2 实现

    直接遍历实现,没有那么多的操作

    int minNumberInRotateArray(vector<int> arr)
    {
        int len = arr.size();
        if (len == 0)
        {
            return 0;
        }
        for (int i = 0; i < len - 1; ++i)
        {
            if (arr[i] > arr[i + 1])
            {
                return arr[i + 1];
            }
        }
    }
    

      

    通过二分确定:

    int minNumberInRotateArray(vector<int> arr)
    {
    
        int len = arr.size();
        if (len == 0)
        {
            return 0;
        }
    
        int end = len - 1;
        int start = 0;
        int mid;
        // 开始的时候赋值为 arr[start] ,避免进不了while循环,
        // 也就是数组并没有旋转过。返回值为空的情况
        int ret = arr[start];
      // 当等于的时候,使用 if 中的循环直接退化为遍历 while (arr[start] >= arr[end]) { if (end - start == 1) // 当差距只有1的时候,那么返回end。 { ret = arr[end]; break; } mid = (start + end) / 2; //二分 //判断相等的时候,也就是说例如 10111这种情况 if (arr[mid] == arr[start] && arr[mid] == arr[end]) { for (int i = start; i < end; ++i) { if (arr[i] > arr[i + 1]) { ret = arr[i + 1]; break; } } } if (arr[start] < arr[mid]) { start = mid; } else { end = mid; } } return ret; }

      

  • 相关阅读:
    linux下使用kermi续
    关于vhdl中integer消耗资源的一些讨论
    linux时间编程
    Linux下C编程文件编程
    C语言I博客作业04
    C语言I博客作业02
    C语言I博客作业02
    第一周作业
    php 面向对象
    php 面向对象封装和继承
  • 原文地址:https://www.cnblogs.com/perfy576/p/8597097.html
Copyright © 2011-2022 走看看