常用算法(一)二分查找

1. 二分查找(非递归,始终返回第一次出现的位置,参考了<<编程珠玑 第 2 版>>)

public int binSearch(int[] nums, int target) {
    int l = -1, u = nums.length;
    while(l + 1 != u){
        int m = l + (u - l) / 2; // 防止溢出
        if(nums[m] < target){
            l = m;
        }else{
            u = m;
        }
    }

    int res = u;
    if(res >= nums.length || nums[res] != target){
        res = -1;
    }

    return res;
}

  

扩展:

1.1 LeetCode 35. Search Insert Position

  有序数组查找,如果没有找到,返回应该插入的位置(也就是直接返回 1 里面的 u)。

1.2 LeetCode 34. Find First and Last Position of Element in Sorted Array

  有序数组查找,返回出现的第一个和最后一个位置。

1.3 剑指 Offer 53

  • 题目一:数字在排序数组中出现的次数。得到第一个和最后一个位置(即 1.2),last - first + 1 即可。
  • 题目二:0 ~ n - 1 中缺失的数字。使用二分查找的思想(剑指 Offer 思路)。
  • LeetCode 268. Missing Number 的数组未排序,排序之后,也可以用题目二的思路。
  • 题目三:数组中数值和下标相等的元素。

2. 二分查找(递归)

int binSearch_recur(int[] arr, int l, int u, int target) {
    if (target < arr[l] || target > arr[u] || l > u) {
        return -1;
    }

    int m = l + (u - l) / 2;
    if (arr[m] > target) {
        return binSearch_recur(arr, l, m - 1, target);
    } else if (arr[m] < target) {
        return binSearch_recur(arr, m + 1, u, target);
    } else {
        return m;
    }
}

  

posted @ 2019-09-06 11:08  Ainsliaea  阅读(227)  评论(0编辑  收藏  举报