From 431b5a7e02fcd233c34dd70ed232bce6d2c7c401 Mon Sep 17 00:00:00 2001 From: Jerry-306 <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 24 Sep 2021 15:59:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200704=20=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=9F=A5=E6=89=BE=20JavaScript=E7=89=88=E6=9C=AC=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原解法逻辑不够简洁清晰,简单问题被其复杂化,所以我提出个人认为更简洁清晰的解法 --- problems/0704.二分查找.md | 49 +++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/problems/0704.二分查找.md b/problems/0704.二分查找.md index f358d2be..67809000 100644 --- a/problems/0704.二分查找.md +++ b/problems/0704.二分查找.md @@ -283,31 +283,46 @@ func search(nums []int, target int) int { // (版本一)左闭右闭区间 +/** + * @param {number[]} nums + * @param {number} target + * @return {number} + */ var search = function(nums, target) { - let l = 0, r = nums.length - 1; - // 区间 [l, r] - while(l <= r) { - let mid = (l + r) >> 1; - if(nums[mid] === target) return mid; - let isSmall = nums[mid] < target; - l = isSmall ? mid + 1 : l; - r = isSmall ? r : mid - 1; + let left = 0, right = nums.length; + // 使用左闭右开区间 [left, right) + while (left < right) { + let mid = left + Math.floor((right - left)/2); + if (nums[mid] > target) { + right = mid; // 去左区间寻找 + } else if (nums[mid] < target) { + left = mid + 1; // 去右区间寻找 + } else { + return mid; + } } return -1; }; // (版本二)左闭右开区间 +/** + * @param {number[]} nums + * @param {number} target + * @return {number} + */ var search = function(nums, target) { - let l = 0, r = nums.length; - // 区间 [l, r) - while(l < r) { - let mid = (l + r) >> 1; - if(nums[mid] === target) return mid; - let isSmall = nums[mid] < target; - l = isSmall ? mid + 1 : l; - // 所以 mid 不会被取到 - r = isSmall ? r : mid; + let left = 0, right = nums.length; + // 使用左闭右开区间 [left, right) + while (left < right) { + let mid = left + Math.floor((right - left)/2); + if (nums[mid] > target) { + right = mid; // 去左区间寻找 + } else if (nums[mid] < target) { + left = mid + 1; // 去右区间寻找 + } else { + return mid; + } } return -1; };