zoukankan      html  css  js  c++  java
  • 旋转数组的最小数字

    意外发现的小代码:

     char * parr = new char[10];
        memset(parr, 0, 10);
        int len_one = strlen(parr);
        int len_two = sizeof(parr);
        int len_three = sizeof(*parr);
        cout << len_one << " and " << len_two << " and " << len_three << endl;

    答案:0,4,1

    麻烦的做法:遍历数组,找出最小值

    class Solution {
    public:
        int minNumberInRotateArray(vector<int> rotateArray) {
            int length = rotateArray.size();
            if(length == 0)
                return 0;
            int num = 6501;
            for(int i = 0; i < length; i++)
            {
                if(rotateArray[i] < num)
                    num = rotateArray[i];
            }
            return num;
        }
    };

    思路:二分思想

     剑指offer做法:正常的二分就是用两个指针,如果mid>=left 那么最小的数在后面,所以是left = mid;如果mid<=right那么最小的数在前面,所以right= mid;

    循环条件是什么呢?左边的数字一定大于或等于右边的数字

    两种特殊情况:

    1.左边的数字小于右边的数字,在旋转0个数的情况下,即为排好序的数组,没旋转

    2.left, right, mid 都相等的情况:例如:{0,1,1,1,1} 旋转后:{1,0,1,1,1,}   或者{1,1,1,0,1}  ,在相等的情况下,left 和  right 指针就不能  按照原来的规则移动了,因为最小的数可能在左边也可能在右边。这种情况只能采取一种办法,就是顺序查找最小的数。

    class Solution {
    public:
        int minNumber(vector<int> rotateArray,int left,int right)
        {
            int num = rotateArray[left];
            for(int i = left+1; i <= right; i++)
            {
                if(rotateArray[i] < num)
                    num = rotateArray[i];
            }
            return num;
        }
    int minNumberInRotateArray(vector<int> rotateArray) {
        int length = rotateArray.size();
        if(length == 0)
            return 0;
       if(length == 1)
          return
    rotateArray[0];
    int left = 0;
        int right = length - 1;
        int mid = left;//防止旋转后的数组已经排好序,这样left < right
        while(rotateArray[left] >= rotateArray[right])
        {
            if(left + 1 == right)
            {
                mid = right;
                break;
            }
            mid = left + (right - left )/2;
            if(rotateArray[left] == rotateArray[right] && rotateArray[mid] == rotateArray[left])
            {
                //顺序查找
                return minNumber(rotateArray,left,right);
            }
            if(rotateArray[mid] >= rotateArray[left])
                left = mid;
            else if(rotateArray[mid] <= rotateArray[right])
                right = mid;
        }
        return rotateArray[mid];
    }
    };

     测试:

    功能测试:数组中可能有重复的数字

    边界值测试:1.一个升序数组2.只包含一个数字的数组

    特殊输入:输入空

  • 相关阅读:
    angular2 如何使用animate实现动画效果
    angular2+ 组件中用@import进来的css不起作用
    ReentrantLock & AQS
    常用JDK命令
    分布式缓存
    持续交付
    持续部署
    持续集成
    领域驱动设计简介
    spring boot 整合JPA bean注入失败
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/8604720.html
Copyright © 2011-2022 走看看