二分查找总结及部分Lintcode题目分析 1
进行二分查找课程回顾与总结,包括以下几个方面,二分法的模板总结和解题思路、应用。
二分法模板总结classical binary search:
1. 必须要做的排除极端情况,也就是数组(用A表示)不存在即A == None或者 A为空,即len(A) == 0 的情况。
2. 二分法核心找的是mid值,并判断这个mid是否跟我们要找的target一致,或者和target之间的关系,所以要先判断start和end。为start和end赋值,start = 0, end = len(A) - 1
3. 之后就是要进行while循环,目的是用一次次的二分来找出是否存在target或者target的位置、范围等问题,条件是start + 1 < end来避免死循环
并有 mid = start + ( end - start ) / 2 来避免溢出
4. 判断A[mid] 与 target的关系,及采取怎样的赋值操作来保留有解的一半,即start == mid 或者 end == mid
5. 可能A[start] 与 A[end]的值与target相同,但是已经使 start + 1 < end 这个条件为False,所以在循环外还要判断这两个值是否和target一致。
6. 如果都不相等的话则返回空
下面,给出classical binary search的解法,这是简单而典型的binary search on index的问题
- class Solution:
- # @param {int[]} A an integer array sorted in ascending order
- # @param {int} target an integer
- # @return {int} an integer
- def findPosition(self, A, target):
- # they are different
- if A is None or len(A) == 0:
- return -1
- # set start and end
- end = len(A) - 1
- start = 0
- # while loop, use start + 1 < end to avoid dead loop
- while (start + 1 < end):
- mid = start + ( end - start ) / 2
- if A[mid] == target:
- return mid
- elif A[mid] > target:
- # start..mid..end, target in start..mid
- end = mid
- else:
- start = mid
- if A[start] == target:
- return start
- if A[end] == target:
- return end
- return -1
由经典算法可以展开到the first position or the last position,都是binary search on index的典型例子,在这两种中即使找到了相应的元素为了判断是否是最开始或者最后的位置,在第四第五步要有所不同~以last position为例
- while (start + 1 < end):
- mid = start + ( end - start ) / 2
- if A[mid] == target:
- start = mid
- elif A[mid] > target:
- # start..mid..end, target in start..mid
- end = mid
- else:
- start = mid
- if A[end] == target:
- return end
- if A[start] == target:
- return start
比较类似的像 search a 2D matrix 问题,只是把二维数组展开成一个一维数组,继续采用上面的二分法模板就可以解
- class Solution:
- """
- @param matrix, a list of lists of integers
- @param target, an integer
- @return a boolean, indicate whether matrix contains target
- """
- def searchMatrix(self, matrix, target):
- if matrix is None or len(matrix) == 0:
- return False
- m = len(matrix)
- n = len(matrix[0])
- start = 0
- end = m * n - 1
- while(start + 1 < end):
- mid = start + (end - start) / 2
- line = mid / n
- column = mid % n
- if matrix[line][column] == target:
- return True
- elif matrix[line][column] < target:
- start = mid
- else:
- end = mid
- if matrix[(start / n)][(start % n)] == target:
- return True
- if matrix[(end / n)][(end % n)] == target:
- return True
- return False
search insert position 只要把握住二分法一个重要的特性,就是判断条件,就可以转化为找first position >= target 的问题
- class Solution:
- """
- @param A : a list of integers
- @param target : an integer to be inserted
- @return : an integer
- """
- def searchInsert(self, A, target):
- # find the position whose value is equal or more than target
- # only consider no duplicates conditions
- if A is None or len(A) == 0:
- return 0
- start = 0
- end = len(A) - 1
- while(start + 1 < end):
- mid = start + (end - start) / 2
- if A[mid] >= target:
- end = mid
- else:
- start = mid
- if A[start] >= target:
- return start
- if A[end] >= target:
- return end
# a condition that the target is more than all of the elements in array- if A[end] < target:
- return end + 1
- return -1
二分查找总结及部分Lintcode题目分析 1的更多相关文章
- 二分查找总结及部分Lintcode题目分析 2
Search in a big sorted array,这个比之前的二分法模板多了一个很不同的特性,就是无法知道一个重要的条件end值,也是题目中强调的重点 The array is so big ...
- 二分查找总结及部分Lintcode题目分析 4
二分法不只能像之前的记录,可以找到index~第二种类型是找到二分答案.有以下几个例子,都是之前二分法的扩展,不再赘述,只记录下忽略的点,以后回顾多注意~ 1. wood cut class Solu ...
- 二分查找总结及部分Lintcode题目分析 3
Search in rotated sorted array,题目中也给出了相应的例子,就是在sorted array某个节点发生了翻转(ie.0 1 2 4 5 6 7 might become 4 ...
- 二叉树总结及部分Lintcode题目分析 1
1. 遍历问题 Preorder / Inorder / Postorder preorder: root left right inorder: left root right postorder: ...
- Find Minimum in Rotated Sorted Array 典型二分查找
https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array/ Suppose a sorted array is rot ...
- HDU 3763 CD【二分查找】
解题思路:给出两个数列an,bn,求an和bn中相同元素的个数因为注意到n的取值是0到1000000,所以可以用二分查找来做,因为题目中给出的an,bn,已经是单调递增的,所以不用排序了,对于输入的每 ...
- POJ 3273 Monthly Expense二分查找[最小化最大值问题]
POJ 3273 Monthly Expense二分查找(最大值最小化问题) 题目:Monthly Expense Description Farmer John is an astounding a ...
- 二分查找里的upper bound与lower bound的实现与分析
1. 问题引入 最近参选了学堂在线的课程数据结构(2015秋).课程由清华大学的邓俊辉老师主讲,在完成课后作业时,遇到了这样一个题目范围查询.在这个题目中,我需要解决这样一个子问题:给定了一组已经排好 ...
- (二分查找 拓展) leetcode 34. Find First and Last Position of Element in Sorted Array && lintcode 61. Search for a Range
Given an array of integers nums sorted in ascending order, find the starting and ending position of ...
随机推荐
- time 类
timeStamp = time.time() #获取当前的时间戳 print(timeStamp) # 1555555453.6283455 timeTuple = time.localtime(t ...
- rest framework之APIView
一.rest framework配置 1.安装rest framework 在django环境中安装rest-framework框架: (automatic) C:\Users\Administrat ...
- 一个简易h5涉及的ps技巧
事实证明,很长时间不做,是会忘掉的呀,的呀,呀,啊~ 1.合并图层 CTRL+E合并多个图层 2.切片 3.导出 文件-------导出------存储为web所用格式-------->> ...
- Redis探索之路(一):Redis简介
一:NOSQL NotOnlySQL 反SQL运动,非关系型数据库(区别于Mysql关系型书库). 随着Web2.0兴起,“高性能”,“高并发”成为主流. NoSQL以key-value形式存储数据, ...
- JAVA javac
{ 用法: javac <options> <source files>其中, 可能的选项包括: -g 生成所有调试信息 - ...
- delphi DBGrid简单自绘(字体颜色、背景等)
delphi DBGrid简单自绘(字体颜色.背景等) 从网上找的代码 应该是C#写的,其实delphi 的操作类似: 1 2 3 4 5 6 7 8 9 10 11 12 13 void __fa ...
- 解析Tomcat之HttpServlet详解
解析Tomcat之HttpServlet详解 Servlet的框架是 由两个Java包组成:javax.servlet和javax.servlet.http. 在javax.servlet包中定义了所 ...
- BZOJ 3779: 重组病毒(线段树+lct+树剖)
题面 escription 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力极强.为了阻止这种病毒传播,某安全机构策划了一次实验,来研究这种病 ...
- 关于C++里set_intersection(取集合交集)、set_union(取集合并集)、set_difference(取集合差集)等函数的使用总结
文章转载自https://blog.csdn.net/zangker/article/details/22984803 set里面有set_intersection(取集合交集).set_union( ...
- [Nowcoder] 保护
题意:... 思路: \(LCA\)乱搞+启发式合并(堆) #include <bits/stdc++.h> using namespace std; const int maxn = 2 ...