剑指 Offer II 069. 山峰数组的顶部

最直接想到的,遍历数组 找到最大值的下标 但是这样就需要遍历一遍数组


  func peakIndexInMountainArray(_ arr: [Int]) -> Int {
      
       var temp = arr[0]
        var index = 0
        for i in 0.. temp {
                temp = arr[i]
                index = i
            
            }
        }

        return index


    }

省去变量的写法 相对于上边的 最坏的情况遍历全部

 func peakIndexInMountainArray(_ arr: [Int]) -> Int {
      
       
        for i in 0.. arr[i+1] {
              return i
            
            }
        }
        return -1

    }

二分查找的方法
根据山峰的描述,最左边的下标至少是1开始 最右边的下标最多是n-2
然后从中间开始查找 直到左右到达相同位置
为什么官方的二分法的题解很多都是写的low + (high - low) / 2 而不是 (high + low) / 2
edit: 因为low+high在low和high特别大的时候可能会造成溢出,使用减法避免了溢出发生


func peakIndexInMountainArray(_ arr: [Int]) -> Int {

        let n = arr.count
        var left = 1
        var right = n - 2
        var ans = 0
         
        while left <= right {
            
            let mid =  left + (right - left) / 2
            
            if arr[mid] > arr[mid+1] {
                ans = mid
                right = mid - 1
                
            }else {
                
                left = mid + 1
            }
            
            
        }
                return ans

    }


你可能感兴趣的:(剑指 Offer II 069. 山峰数组的顶部)