二分法

时间复杂度

  • O(1) 极少
  • O(logn) 几乎都是二分法
  • O(√n) 几乎是分解质因数
  • O(n) 高频
  • O(nlogn) 一般都可能要排序
  • O(n^2) 数组,枚举,动态规划
  • O(n^3) 数组,枚举,动态规划
  • O(2^n) 与组合有关的搜索
  • O(n!) 与排列有关的搜索

递归与非递归

  • 不用递归是否造成实现的复杂
  • 递归的深度是否很深

二分法通用模板

  • 可扩展于寻找target第一次出现的位置,最后一次出现的位置
public class BinarySearch {
    /**
     * @param nums: The integer array sorted in ascending order.
     * @param target: Target to find.
     * @return: The position of target.
     */
    public int binarySearch(int[] nums, int target) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        int start = 0, end = nums.length - 1;
        while (start + 1 < end) {
            int mid = start + (end - start) / 2;
            if (nums[mid] == target) {
                return nums[mid];
            } else if (nums[mid] < target) {
                start = mid;
            } else {
                end = mid;
            }
        }
        if (nums[start] == target) return start;
        else if (nums[end] == target) return end;
        else return -1;
    }
}
  • 标准迭代
public int runBinarySearchIteratively(
  int[] sortedArray, int key, int low, int high) {
    int index = Integer.MAX_VALUE;
     
    while (low <= high) {
        int mid = (low + high) / 2;
        if (sortedArray[mid] < key) {
            low = mid + 1;
        } else if (sortedArray[mid] > key) {
            high = mid - 1;
        } else if (sortedArray[mid] == key) {
            index = mid;
            break;
        }
    }
    return index;
}
  • 标准递归
public int runBinarySearchRecursively(
  int[] sortedArray, int key, int low, int high) {
    int middle = (low + high) / 2;
         
    if (high < low) {
        return -1;
    }
 
    if (key == sortedArray[middle]) {
        return middle;
    } else if (key < sortedArray[middle]) {
        return runBinarySearchRecursively(
          sortedArray, key, low, middle - 1);
    } else {
        return runBinarySearchRecursively(
          sortedArray, key, middle + 1, high);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  •   今天在lintCode上面做了一道关于二分法的题,觉得有必要记录下来。 1.概览 (1).题意 (2).说明 ...
    琼珶和予阅读 4,225评论 0 0
  • 一维数组 首先开始最基本的Binary Search, 数组是有序的,但是有重复数。例题: Search for ...
    dol_re_mi阅读 7,075评论 0 2
  • QLU_ACM 浅谈二分搜索技术 by StilllFantasy 二分思想为何物? 二分查找也称折半查找(Bin...
    StilllFantasy阅读 4,019评论 0 3
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 11,497评论 0 13
  • 2018.5.4 我在想怎么样才是最美的情话。 我喜欢你,这应该是18岁之前最美的情话吧。18岁之前我们会喜欢那个...
    不爱种胡萝的兔子阅读 1,256评论 0 0

友情链接更多精彩内容