二分法查找数组最小元素

发布于 2022-10-26 16:45:28 字数 1444 浏览 115 评论 0

已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2] 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7] 注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。

给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。

思路

在数组中任取两数,若左数大于右数,则最小数必位于二者之间,利用这点,很容易想到二分

上代码(js)

/**
 * @param {number[]} nums
 * @return {number}
 */
var findMin = function(nums) {
    let leftIndex = 0,
        rightIndex = nums.length - 1;

    while (true) {
        let midIndex = Math.floor((rightIndex + leftIndex) / 2);
        if (midIndex === leftIndex) {
            return Math.min(nums[leftIndex], nums[rightIndex]);
        }

        if (nums[midIndex] > nums[rightIndex]) {
            leftIndex = midIndex;
        } else {
            rightIndex = midIndex;
        }
    }
};

上代码(python)

import math;
class Solution:
    def findMin(self, nums: List[int]) -> int:
        leftIndex = 0;
        rightIndex = len(nums) - 1;
        while True:
            midIndex = math.floor((leftIndex + rightIndex) / 2);
            if midIndex == leftIndex:
                return min(nums[leftIndex], nums[rightIndex]);

            if nums[midIndex] > nums[rightIndex]:
                leftIndex = midIndex;
            else:
                rightIndex = midIndex;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

早乙女

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文