二分搜索

2022-08-16  本文已影响0人  bowen_wu

概述

模板

public class BinarySearch {
    public int binarySearch(int target, int[] nums) {
        if (nums == null || nums.length == 0) {
            return -1;
        }

        int start = 0;
        int end = nums.length - 1;

        while (start + 1 < end) { // 相邻即退出
            int mid = start + (end - start) / 2; // 可以防止两个整型值相加时溢出
            if (target > nums[mid]) { // 如果数组中有多个 target,此时找到的是最左侧的,即相等时移动的是 end。如果要找最右侧的,那么相等时移动 start 即可
                start = mid;
            } else {
                end = mid;
            }
        }

        if (nums[start] == target) {
            return start;
        }
        if (nums[end] == target) {
            return end;
        }
        return -1;
    }
}
const binarySearch = (nums, target) => {
  if (nums == null || nums.length == 0) {
    return -1;
  }

  let start = 0;
  let end = nums.length - 1;
  while (start + 1 < end) {
    let mid = Math.floor((start + end) / 2);
    if (target > nums[mid]) {
      start = mid;
    } else {
      end = mid;
    }
  }

  if (nums[start] == target) {
    return start;
  }
  if (nums[end] == target) {
    return end;
  }
  return -1;
}

模板变化

时间复杂度

数组区间有序地二分问题

知识点

  1. 一维坐标 index 和二维矩阵坐标(x, y)相互转换
    • x = index / (列数)
    • y = index % (列数)
    • index = x * n + y
上一篇 下一篇

猜你喜欢

热点阅读