From efcd1eb12a9870e3445759b318e63a69c38e314b Mon Sep 17 00:00:00 2001 From: LouisFonda Date: Wed, 25 Jun 2025 23:14:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BA=8C=E5=88=86=E6=9F=A5=E6=89=BE=20?= =?UTF-8?q?153?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../153寻找旋转排序数组中的最小值.js | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 top-interview-leetcode150/binary-search/153寻找旋转排序数组中的最小值.js diff --git a/top-interview-leetcode150/binary-search/153寻找旋转排序数组中的最小值.js b/top-interview-leetcode150/binary-search/153寻找旋转排序数组中的最小值.js new file mode 100644 index 0000000..e3b859d --- /dev/null +++ b/top-interview-leetcode150/binary-search/153寻找旋转排序数组中的最小值.js @@ -0,0 +1,55 @@ +/** + * @param {number[]} nums + * @return {number} + */ +const findMin = function (nums) { + +}; + +/* +数组在某个位置旋转之后会变成两段连续的序列,并且第一段的所有值都比第二段大,我们直接使用二分查找, +如果mid落在第一段,则表明我们需要往右边继续找,使left = mid+1,如果落在第二段则将right=mid,如果 +left===right,返回left所在位置的数即可,就是最小的数。 +*/ +function f1(nums) { + let left = 0; + let right = nums.length - 1; + // 如果nums[right] > nums[left] 表明在第0个位置旋转,或者说没有旋转,直接返回nums[left] + if (nums[right] > nums[left]) return nums[left]; + while (left < right) { + const mid = left + ((right - left) >> 1); + // 如果nums[mid]比nums[0]大则表明它落在第一段 + if (nums[mid] >= nums[0]) { + left = mid + 1; + } else { + right = mid; + } + } + return nums[left]; +} + +/* +方法1通过判断nums[mid]是否大于nums[0],如果大于则表明落在第一段,但是[2,1]这个测试用例通不过,nums[0]就是nums[mid] +自己,所以还要加上等于的情况,也就是说,如果nums[mid] >= nums[0]的话表明落在了第一段,反之落在了第二段,这样又会产生 +新的问题,就是如果旋转的位置是0,也就是说整个数组没有发生旋转,那么最后会找到整个数组中最大的数,所以还要用卫语句处理, +这种方式不太好。 +方法2通过判断nums[mid] > nums[right],如果大于则表明落在第一段,反之落在第二段,而且还能通过上面的测试用例,这种方式 +更加的好,更符合夹逼思想。 +*/ +function f2(nums) { + let left = 0; let + right = nums.length - 1; + + while (left < right) { + const mid = left + ((right - left) >> 1); + + // 与 nums[right] 比较,更直观,逻辑更接近二分标准模型 + if (nums[mid] > nums[right]) { + left = mid + 1; // 最小值在右边 + } else { + right = mid; // 最小值在左边(可能是 mid) + } + } + + return nums[left]; +}