携手创作,一起生长!这是我参与「日新方案 8 月更文应战」的第21天,点击查看活动概况

前语

咱们社区连续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 工作健身教练。)的 Swift 算法题题解收拾为文字版以便利咱们学习与阅览。

LeetCode 算法到现在咱们现已更新到 161 期,咱们会坚持更新时刻和进展(周一、周三、周五早上 9:00 发布),每期的内容不多,咱们期望咱们能够在上班路上阅览,长久积累会有很大提升。

不积跬步,无以致千里;不积小流,无以成江海,Swift社区 伴你前行。如果咱们有建议和定见欢迎在文末留言,咱们会尽力满足咱们的需求。

难度水平:中等

1. 描绘

峰值元素是指其值严格大于左右相邻值的元素。

给你一个整数数组nums,找到峰值元素并回来其索引。数组或许包含多个峰值,在这种情况下,回来 任何一个峰值 所在位置即可。

你能够假设nums[-1] = nums[n] = -∞

你必须完成时刻复杂度为 O(log n) 的算法来处理此问题。

2. 示例

示例 1

输入:nums = [1,2,3,1]
输出:2
解说:3 是峰值元素,你的函数应该回来其索引 2。

示例 2

输入:nums = [1,2,1,3,5,6,4]
输出:1 或 5 
解说:你的函数能够回来索引 1,其峰值元素为 2;
    或者回来索引 5, 其峰值元素为 6。

约束条件:

  • 1 <= nums.length <= 1000
  • -2^31 <= nums[i] <= 2^31 - 1
  • 关于一切有用的 i 都有 nums[i] != nums[i + 1]

3. 答案

class FindPeakElement {
    func findPeakElement(_ nums: [Int]) -> Int {
        var left = 0, right = nums.count - 1, mid = 0
        while left < right {
            mid = (right - left) / 2 + left
            if nums[mid] > nums[mid + 1] {
                right = mid
            } else {
                left = mid + 1
            }
        }
        return left
    }
}
  • 首要思维:经典的二叉搜索。
  • 时刻复杂度: O(logn)
  • 空间复杂度: O(1)

该算法题解的库房:LeetCode-Swift

点击前往 LeetCode 操练

关于咱们

咱们是由 Swift 爱好者一起保护,咱们会共享以 Swift 实战、SwiftUI、Swift 基础为核心的技能内容,也收拾搜集优异的学习材料。