【算法总结】Binary search 二分法

来源:互联网 发布:高性能网络编程 陶辉 编辑:程序博客网 时间:2024/04/30 08:55

  1. 描述:
    二分法主要用于查找在有序的数列下某个特定条件下的边界或者特定值。
  2. 例题:
    • 单递增序列:
      • Search Insert Position
      • Search a 2D Matrix
    • 断层序列:找Mid 和 start的关系。
      • Find Minimum in Rotated Sorted Array
    • 有增有减得序列:找每一个区间的关系。
      • Find Peak Element
    • 构建递增序列:
      • Longest Increasing Subsequence
  3. 解决方法:
    • 无序的话,先排序寻找有序的区间进行二分。
    • 用两个指针,不断的二分寻找区间,判断舍弃哪个一半的区间。
    • 最后判断处理结束条件,是左边界结束还是右边界。
  4. 复杂度:
    • 时间复杂度:对一段序列的二分是 O(Logn), n是序列的长度,如果要先排序的,增增加O(nlogn)的排序时间。
    • 空间复杂度:两个指针的空间 O(1)
  5. 代码模板:
    • public int binarySearch(int[] nums, int target){//如果序列无序,先进行排序Arrays.sort(nums);//用两边界作为指针不断二分int l =0;int r = nums.length;//l+1<r 是保证l在r左边不重合结束while(l+1 < r){int mid = l + (r-l)/2;//找到target就返回if(nums[mid] == target){return mid;}//根据区间切分if(nums[mid] > target){r = mid;}else{l = mid;}}//如果还没结束,则判断下边界,l在r右边.先判断l还是先判断r,看具体条件。if(nums[l] == target){return l;}else if(nums[r] == target){return r;}return 0;}



0 0
原创粉丝点击