• 搜索旋转排序数组--二分查找


    题目

    假设按照升序排序的数组在预先未知的某个点上进行了旋转。

    ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

    搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

    你可以假设数组中不存在重复的元素。

    你的算法时间复杂度必须是 O(log n) 级别。

    示例 1:

    输入: nums = [4,5,6,7,0,1,2], target = 0
    输出: 4

    示例 2:

    输入: nums = [4,5,6,7,0,1,2], target = 3
    输出: -1

    思想

    题目要求 O(logN)O(logN) 的时间复杂度,基本可以断定本题是需要使用二分查找,怎么分是关键。

    由于题目说数字了无重复,举个例子:

    1 2 3 4 5 6 7 可以大致分为两类,

    第一类 2 3 4 5 6 7 1 这种,也就是 nums[start] <= nums[mid]。此例子中就是 2 <= 5

    这种情况下,前半部分有序。因此如果 nums[start] <=target<nums[mid],则在前半部分找,否则去后半部分找。

    第二类 6 7 1 2 3 4 5 这种,也就是 nums[start] > nums[mid]。此例子中就是 6 > 2

    这种情况下,后半部分有序。因此如果 nums[mid] <target<=nums[end],则在后半部分找,否则去前半部分找。

    很多人问,那里为什么是小于等于。其实就是为了最后只剩两个数的时候,怎么和我那个逻辑匹配。

    代码

    func search(_ nums: [Int], _ target: Int) -> Int {
        if nums.count <= 0 {
            return -1
        }
        var start = 0
        var end = nums.count - 1
        var mid: Int = 0
        while start <= end {
            mid = start + (end - start) / 2
            if nums[mid] == target {
                return mid
            }
            if nums[start] <= nums[mid] {
                if target >= nums[start] && target < nums[mid] {
                    end = mid - 1
                } else {
                    start = mid + 1
                }
            } else {
                if target <= nums[end] && target > nums[mid] {
                    start = mid + 1
                } else {
                    end = mid - 1
                }
            }
        }
        return -1
    }

    直接复制粘贴上面的代码,即可成功,此算法并不是很难,就不做过多的解释!!!

  • 相关阅读:
    server 2012 r2 配置
    在线流媒体nginx/Windows解决方案
    ECS上配置FTP Filezilla
    新项目扫雷专贴 备忘录
    如何解决 Windows 实例出现身份验证错误及更正 CredSSP
    win10 再次重装系统
    SAI窗口无法移动
    无法将分支 master 发布到远程 origin,因为远程存储库中已存在具有同一名称的分支
    遇到技嘉 Gigabyte UEFI DualBIOS问题
    dnsunlocker解决
  • 原文地址:https://www.cnblogs.com/guohai-stronger/p/12056691.html
Copyright © 2020-2023  润新知