zoukankan      html  css  js  c++  java
  • 剑指 Offer 11. 旋转数组的最小数字-7月22日

    题目

    剑指 Offer 11. 旋转数组的最小数字

    我的思路

    显然用二分查找,时间复杂度logn,最坏情况可能达到n。

    要注意二分查找的边界条件判断,以及如果无法判断此次二分是取左或者去右时,可以尝试把上边界下标减1,再重新二分(安全地缩小边界)。

    我的实现

    class Solution {
    public:
        int minArray(vector<int>& numbers) {
            int low = 0;
            int high = numbers.size()-1;
            int s;
            while(low!=high){
                s = low + (high - low)/2;
                if(numbers[high]>numbers[low]) return numbers[low];
                else if(numbers[high]<numbers[low]&&numbers[s]>=numbers[low]) low = s + 1;
                else if(numbers[high]<numbers[low]&&numbers[s]<=numbers[low]) high = s;
                else if(numbers[high]==numbers[low]){high--;}
            }
            return numbers[low];
        }
    };
    //二分查找
    /*
    先把两个指针low和high 指向数组首尾。若最小元素的指针(下标)是m,二分过程中的分界下标是s。
    可能存在以下几种情况:
    1.n[high]>n[low] return n[low]
    2.n[high]<n[low] n[s]>=n[low] low = s+1
    3.n[high]<n[low] n[s]<=n[high] high = s
    4.n[high]==n[low] high--;//神来之笔,遇到无法判断二分到哪一边时,可以尝试直接把上边界象征性减小一点,重新判断
    */

    拓展学习

    为什么官方的二分法的题解很多都是写的low + (high - low) // 2 而不是 (high + low) // 2?

     (high + low) 在两者较大时会发生整型越界!

  • 相关阅读:
    python学习笔记(7)
    python学习笔记(6)
    python学习笔记(5)
    python学习笔记(4)
    python学习笔记(3)
    python学习笔记(2)
    软件工程结对编程第二次作业
    软件工程结对编程第一次作业
    软件工程第三次作业
    答编辑问
  • 原文地址:https://www.cnblogs.com/BoysCryToo/p/13360650.html
Copyright © 2011-2022 走看看