zoukankan      html  css  js  c++  java
  • 2算法-二分查找

    独孤九剑:总诀式:心法总纲

    1.破剑式

    2.破刀式

    3.破枪式

    4.破索式

    5.破掌式

    6.破箭式

    7.破气式

    1.二分查找的时间复杂度是O(logn)

    1.算法面试中如果需要优化O(n)的时间复杂度,那么只能是O(logn)的二分法

    2.Recursion or while –loop?

    如果问题不复杂,能用递归就用递归。

    如果问题比较复杂,那就用递归。

    3.避免死循环,条件 start + 1 < end

    4.指针变化 start = mid

    2.四要素:

    1.start + 1 < end

    2.start + (end – start) /2 (这样写的好处可以避免start ,end 过大造成超出系统最大值)

    3.A[mid] == , < , >

    4.A[start]  A[end] ?target

    3.题型分类

    第一个位置还是最后一个位置 或任何一个位置

    4.各种题目变形

    4.1搜索区间

    给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。

    如果目标值不在数组中,则返回[-1, -1]

    样例

    给出[5, 7, 7, 8, 8, 10]和目标值target=8,

    返回[3, 4]

     

    4.2. 搜索插入位置、

    给定一个排序数组和一个目标值,如果在数组中找到目标值则返回索引。如果没有,返回到它将会被按顺序插入的位置。

    你可以假设在数组中无重复元素。

    样例

    [1,3,5,6],5 → 2

    [1,3,5,6],2 → 1

    [1,3,5,6], 7 → 4

    [1,3,5,6],0 → 0

    4.3. 搜索二维矩阵

    写出一个高效的算法来搜索 m × n矩阵中的值。

    这个矩阵具有以下特性:

    • 每行中的整数从左到右是排序的。
    • 每行的第一个数大于上一行的最后一个整数。

    样例

    考虑下列矩阵:

    [
      [1, 3, 5, 7],
      [10, 11, 16, 20],
      [23, 30, 34, 50]
    ]
    

    给出 target = 3,返回 true

    4.4 搜索二维矩阵2

    写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数。

    这个矩阵具有以下特性:

    • 每行中的整数从左到右是排序的。
    • 每一列的整数从上到下是排序的。
    • 在每一行或每一列中没有重复的整数。

    样例

    考虑下列矩阵:

    [

        [1, 3, 5, 7],

        [2, 4, 7, 8],

        [3, 5, 9, 10]

    ]

    给出target = 3,返回 2

     

    4.5 第一个错误的代码版本

    代码库的版本号是从 1 到 n 的整数。某一天,有人提交了错误版本的代码,因此造成自身及之后版本的代码在单元测试中均出错。请找出第一个错误的版本号。

    你可以通过 isBadVersion 的接口来判断版本号 version 是否在单元测试中出错,具体接口详情和调用方法请见代码的注释部分。

    样例

    给出 n=5

    调用isBadVersion(3),得到false

    调用isBadVersion(5),得到true

    调用isBadVersion(4),得到true

    此时我们可以断定4是第一个错误的版本号

    注意

    请阅读上述代码,对于不同的语言获取正确的调用 isBadVersion 的方法,比如java的调用方式是VersionControl.isBadVersion

     

    循环移动的数组

    4.6 寻找旋转排序数组中的最小值

    假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。

    你需要找到其中最小的元素。

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

    样例

    给出[4,5,6,7,0,1,2]  返回 0

    4.7 寻找旋转排序数组中的最小值2

    假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。

    你需要找到其中最小的元素。

    数组中可能存在重复的元素。

    样例

    给出[4,4,5,6,7,0,1,2]  返回 0

    4.8 搜索旋转排序数组

    假设有一个排序的按未知的旋转轴旋转的数组(比如,0 1 2 4 5 6 7 可能成为4 5 6 7 0 1 2)。给定一个目标值进行搜索,如果在数组中找到目标值返回数组中的索引位置,否则返回-1。

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

    样例

    给出[4, 5, 1, 2, 3]和target=1,返回 2

    给出[4, 5, 1, 2, 3]和target=0,返回 -1

    4.9 搜索旋转排序数组 2

    跟进“搜索旋转排序数组”,假如有重复元素又将如何?

    是否会影响运行时间复杂度?

    如何影响?

    为何会影响?

    写出一个函数判断给定的目标值是否出现在数组中。

    样例

    给出[3,4,4,5,7,0,1,2]和target=4,返回 true

    4.10 两个排序数组的中位数

    两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n))。

    样例

    给出数组A = [1,2,3,4,5,6] B = [2,3,4,5],中位数3.5

    给出数组A = [1,2,3] B = [4,5],中位数 3

    三步翻转法:

    4.11 恢复旋转排序数组

    给定一个旋转排序数组,在原地恢复其排序。

    样例

    [4, 5, 1, 2, 3] -> [1, 2, 3, 4, 5]

    4.12 旋转字符串

    给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)

    样例

    对于字符串 "abcdefg".

    offset=0 => "abcdefg"
    offset=1 => "gabcdef"
    offset=2 => "fgabcde"
    offset=3 => "efgabcd"

    4.13  翻转字符串 为words

    给定一个字符串,逐个翻转字符串中的每个单词。

    样例

    给出s = "the sky is blue",返回"blue is sky the"

    说明

    • 单词的构成:无空格字母构成一个单词
    • 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
    • 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个

    5.总结:

    1.二分查找(4 要素)

    2.翻转数组:min

    a.找到最小值

    b. 找到目标 target

    c. why O(n) with duplicates?

    3.找中位数:find kth

    4.翻转3步法

  • 相关阅读:
    Finite Difference Method with Mathematica
    评论
    The Woman in Red Is Seen as a Threat by Other Wom
    Why Does Everyone Else Appear to Be Succeeding?
    The Sorrows of Young Werther
    【洛谷P5607】无力回天 NOI2017
    【YbtOJ#532】往事之树
    【YbtOJ#582】大收藏家
    【牛客Wannafly挑战赛23 F】计数
    【YbtOJ#573】后缀表达
  • 原文地址:https://www.cnblogs.com/chaoren399/p/4853490.html
Copyright © 2011-2022 走看看