二分法不只能像之前的记录,可以找到index~第二种类型是找到二分答案。有以下几个例子,都是之前二分法的扩展,不再赘述,只记录下忽略的点,以后回顾多注意~

1. wood cut

  1. class Solution:
  2. """
  3. @param L: Given n pieces of wood with length L[i]
  4. @param k: An integer
  5. return: The maximum length of the small pieces.
  6. """
  7. def pieces(self, L, length):
  8. p = 0
  9. for i in L:
  10. p += i / length
  11. return p
  12.  
  13. def woodCut(self, L, k):
  14. # at first, this if check condition is ignored
  15. if sum(L) < k:
  16. return 0
  17. start = 1
    # at first, use the average of sum of array.
  18. end = max(L)
  19. while start + 1 < end:
  20. mid = start + (end - start) / 2
  21. if self.pieces(L, mid) >= k:
  22. start = mid
  23. else:
  24. end = mid
  25. if self.pieces(L, end) >= k:
  26. return end
  27. return start

2. First Bad Version:可以看成找到第一个是false的位置

  1. #class SVNRepo:
  2. # @classmethod
  3. # def isBadVersion(cls, id)
  4. # # Run unit tests to check whether verison `id` is a bad version
  5. # # return true if unit tests passed else false.
  6. # You can use SVNRepo.isBadVersion(10) to check whether version 10 is a
  7. # bad version.
  8. class Solution:
  9. """
  10. @param n: An integers.
  11. @return: An integer which is the first bad version.
  12. """
  13. def findFirstBadVersion(self, n):
  14. start = 1
  15. end = n
  16. while(start + 1 < end):
  17. mid = start + (end - start) / 2
  18. if SVNRepo.isBadVersion(mid):
  19. end = mid
  20. else:
  21. start = mid
  22. if SVNRepo.isBadVersion(start):
  23. return start
  24. return end

3. Search for a range:找到first position和last position的结合体,不过需要两次遍历,还没有找到更好的方法

  1. class Solution:
  2. """
  3. @param A : a list of integers
  4. @param target : an integer to be searched
  5. @return : a list of length 2, [index1, index2]
  6. """
  7. def searchRange(self, A, target):
  8. # write your code here
  9. if A is None or len(A) == 0:
  10. return[-1,-1]
  11. start = 0
  12. end = len(A) - 1
  13. while(start + 1 < end):
  14. mid = start + (end - start) / 2
  15. if A[mid] == target:
  16. end = mid
  17. elif A[mid] < target:
  18. start = mid
  19. else:
  20. end = mid
  21. if A[start] == target:
  22. left = start
  23. elif A[end] == target:
  24. left = end
  25. else:
  26. return[-1,-1]
  27.  
  28. start = left
  29. end = len(A) - 1
  30. while start + 1 < end:
  31. mid = start + (end - start) / 2
  32. if A[mid] == target:
  33. start = mid
  34. elif A[mid] < target:
  35. start = mid
  36. else:
  37. end = mid
  38. if A[end] == target:
  39. right = end
  40. # one tip: cannot use another if, because there maybe two continuous
  41. # same num. so A[start] and A[end] maybe the same and the value of
  42. # A[start] may override the right value
  43. elif A[start] == target:
  44. right = start
  45. return [left,right]

二分查找总结及部分Lintcode题目分析 4的更多相关文章

  1. 二分查找总结及部分Lintcode题目分析 1

    进行二分查找课程回顾与总结,包括以下几个方面,二分法的模板总结和解题思路.应用. 二分法模板总结classical binary search: 1. 必须要做的排除极端情况,也就是数组(用A表示)不 ...

  2. 二分查找总结及部分Lintcode题目分析 2

    Search in a big sorted array,这个比之前的二分法模板多了一个很不同的特性,就是无法知道一个重要的条件end值,也是题目中强调的重点 The array is so big ...

  3. 二分查找总结及部分Lintcode题目分析 3

    Search in rotated sorted array,题目中也给出了相应的例子,就是在sorted array某个节点发生了翻转(ie.0 1 2 4 5 6 7 might become 4 ...

  4. 二叉树总结及部分Lintcode题目分析 1

    1. 遍历问题 Preorder / Inorder / Postorder preorder: root left right inorder: left root right postorder: ...

  5. Find Minimum in Rotated Sorted Array 典型二分查找

    https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array/ Suppose a sorted array is rot ...

  6. HDU 3763 CD【二分查找】

    解题思路:给出两个数列an,bn,求an和bn中相同元素的个数因为注意到n的取值是0到1000000,所以可以用二分查找来做,因为题目中给出的an,bn,已经是单调递增的,所以不用排序了,对于输入的每 ...

  7. POJ 3273 Monthly Expense二分查找[最小化最大值问题]

    POJ 3273 Monthly Expense二分查找(最大值最小化问题) 题目:Monthly Expense Description Farmer John is an astounding a ...

  8. 二分查找里的upper bound与lower bound的实现与分析

    1. 问题引入 最近参选了学堂在线的课程数据结构(2015秋).课程由清华大学的邓俊辉老师主讲,在完成课后作业时,遇到了这样一个题目范围查询.在这个题目中,我需要解决这样一个子问题:给定了一组已经排好 ...

  9. (二分查找 拓展) 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 ...

随机推荐

  1. boost 大小端转换

    boost 中有一个edmian 里面有转换函数模板 native_to_little<T> 本地转换为小端 native_to_bit<T> 本地转换为大端

  2. ES6面试 知识点汇总(全)

    近期在复习ES6,针对ES6新的知识点,以问答形式整理一个全面知识和问题汇总.(全干货,适合对ES6有一定理解的同学复习,以及ES6面试.) 一.问:ES6是什么? 答: ES6是新一代的JS语言标准 ...

  3. Java——super关键字

    2.3 super关键字 ①super不是引用类型,super中存储的不是内存地址,super指向的不是父类对象. ②super代表的是当前子类对象中的父类型特征. ③什么时候使用super? 类和父 ...

  4. spring5.02版快速入门

    spring5.02版快速入门分为以下 四步, 1. 引入依赖 2. 创建beans.xml配置文件 3 创建相应的接口实现类(仅仅是快速创建,实现类不给任何方法) 4. 创建容器对象,根据id获取对 ...

  5. Oracle分页:工作记录

    Oracle分页:传入值为List<String> . Mybatis XXXMapper.xml SELECT * FROM ( SELECT ROWNUM rn, t1.cardnum ...

  6. 依赖背包优化——hdu1561

    傻逼依赖背包的优化 #include<bits/stdc++.h> using namespace std; #define N 205 ]; int head[N],tot,n,m,a[ ...

  7. delphi 获取文件图标

    {根据文件的名字得到此文件在系统中对应大小的图标large=true(64*64) false(32*32)}procedure GetFileIcon(TypeName: Widestring; I ...

  8. NX二次开发-获取UG界面窗口句柄UF_UI_get_default_parent

    1 extern "C" DllExport void ufusr(char *param, int *retcod, int param_len) 2 { 3 4 if (UF_ ...

  9. linux网络速率监控

    #!/bin/bash #作者:fafu_li #时间: #监控网卡传输速率 source /etc/profile #加载系统环境变量 source $HOME/.bash_profile #加载用 ...

  10. 【Web】浅析JQuery的apply(), call(), bind()方法

    原文地址:https://blog.csdn.net/whuzxq/article/details/64166253 由于在理解this的用法的时候多次出现了这几个方法,个人对这几个方法理解的不是很透 ...