独孤九剑:总诀式:心法总纲
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步法