二分法查找

// typescript版本的
/**
 * 二分法查找
 * @param {Array<number>}  -nums  查找的数组  如[1,2,3,4]
 * @param  {number} key   -需要查找的值  如3
 * @return {number} -返回下标或者-1(未找到)
 */
function binarySearch(nums: Array<Number>, key: Number): Number {
	let l = 0;                // 左边界 0最小
	let r = nums.length - 1;  // 右边界 nums.length-1 最大

	// 终止条件左边
	while (l <= r) {
		let m = l + Math.floor((r - l) / 2);  // 取中间下标
		// let m = Math.floor((l + r) / 2);  // 这种有可能会溢出
		if (nums[m] === key) {
			// 中间值等于所要查找的值
			return m;
		} else if (nums[m] > key) {
			// 中间值大于所要查找的值  右边界更改
			r = m - 1;
		} else {
			// 中间值小于所要查找的值  左边界更改
			l = m + 1;
		}
	}
	return -1;
}


// 编译后的
/**
 * 二分法查找
 * @param {Array<number>}  -nums  查找的数组  如[1,2,3,4]
 * @param  {number} key   -需要查找的值  如3
 * @return {number} -返回下标或者-1(未找到)
 */
function binarySearch(nums, key) {
    var l = 0; // 左边界 0最小
    var r = nums.length - 1; // 右边界 nums.length-1 最大
    // 终止条件左边
    while (l <= r) {
        var m = l + Math.floor((r - l) / 2); // 取中间下标
        // let m = Math.floor((l + r) / 2);  // 这种有可能会溢出
        if (nums[m] === key) {
            // 中间值等于所要查找的值
            return m;
        }
        else if (nums[m] > key) {
            // 中间值大于所要查找的值  右边界更改
            r = m - 1;
        }
        else {
            // 中间值小于所要查找的值  左边界更改
            l = m + 1;
        }
    }
    return -1;
}

总结

  1. 二分法只适用于类似[1,2,3,4]的有顺序的数组查找。
  2. 二分法时间复杂度O(log2n)。
  3. 二分法核心在于边界值的判断,需要灵活运用。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值