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

其实是求最小值,但是直接这样写的话,题目里面的有序数组的反转就失去了意义,应该是有不用全部遍历一遍的算法

func minArray(_ numbers: [Int]) -> Int {

     var min = numbers[0]
        for number in numbers {
             if number < min {
                 min = number
            }
                
        }
        return min

    }

二分法

为什么官方的二分法的题解很多都是写的low + (high - low) / 2 而不是 (high + low) / 2
edit: 因为low+high在low和high特别大的时候可能会造成溢出,使用减法避免了溢出发生

默认是的有序是升序的


func minArray(_ numbers: [Int]) -> Int {

        var left = 0
        var right = numbers.count - 1
        while left < right {
            
            let mid = left + (right - left) / 2
            //因为是升序的,所以最小值应该在右边,指针应该向右移动
            if numbers[mid] > numbers[right] {
                
                 left = mid + 1
                //遇到相等的元素了,暴力的将右指针向左边移动
            }else if  numbers[mid] == numbers[right] {
                
                right -= 1
                //说明右边是有序的,最小值应该在mid的左边
            } else  {
                
                right = mid
   
            }       
        }
    
        return numbers[left]
    }
截屏2022-02-25 下午6.51.25.png
截屏2022-02-25 下午6.52.14.png
截屏2022-02-25 下午6.55.19.png

你可能感兴趣的:(剑指 Offer 11. 旋转数组的最小数字)