算法入门C——278. 第一个错误的版本

本文分享了LeetCode刷题过程中使用二分查找解决'第一错误版本'问题的思路,对比了个人实现与官方高效版本,并讨论了内存消耗和时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode刷题——算法学习计划(入门部分)

题目描述

在这里插入图片描述

思路介绍

由于本人学算法只是为了巩固C语言基础,所以就不会去深挖算法之根本

算法:二分法查找适用于数据量较大时,但是数据需要先排好顺序。主要思想是:(设查找的数组区间为array[low, high])
(1)确定该区间的中间位置K(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]b.array[k]<T 类似上面查找区间为array[k+1,……,high]。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间将缩小一半,递归查找即可。时间复杂度为:O(log2n)。——百度百科

我的第一次正确提交

由于昨天练习了二分法,所以今天基本没遇到啥奇怪的问题

我使用了比较直观的方法判断版本是否为第一个错误版本——最后一次正确提交下一次错误提交即为第一个错误版本。

// The API isBadVersion is defined for you.
// bool isBadVersion(int version);

int firstBadVersion(int n) 
{
    int left = 1;
    int right = n;
    int middle = 0;
    while(left <= right)
    {
        middle = (right - left) / 2 + left;
        if(isBadVersion(middle) == false && isBadVersion(middle + 1) == true)
            return middle + 1;
        else if(isBadVersion(middle) == true && isBadVersion(middle + 1) == true)
            right = middle - 1;
        else 
            left = middle + 1;
    }
    return 1; //第一版本就是错的
}

怎么会只用0ms,不合理啊

在这里插入图片描述

官方版本

下面是官方版本

只能说妙,先记下,以后再琢磨琢磨(不知道有没有以后😁)

int firstBadVersion(int n) {
    int left = 1, right = n;
    while (left < right) {  // 循环直至区间左右端点相同
        int mid = left + (right - left) / 2;  // 防止计算时溢出
        if (isBadVersion(mid)) {
            right = mid;  // 答案在区间 [left, mid] 中
        } else {
            left = mid + 1;  // 答案在区间 [mid+1, right] 中
        }
    }
    // 此时有 left == right,区间缩为一个点,即为答案
    return left;
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/first-bad-version/solution/di-yi-ge-cuo-wu-de-ban-ben-by-leetcode-s-pf8h/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

5.3MB,但其实每次提交内存消耗都不同,有时比我那个版本还高,不懂了。

在这里插入图片描述


下面是我的失败的提交记录

试了一下用循环判断的方法,结果是肯定对的,但LeetCode判我为时间超过限制。
在这里插入图片描述

// The API isBadVersion is defined for you.
// bool isBadVersion(int version);

int firstBadVersion(int n) {
    int i = 0;
    for(i = n; i >= 1; i--)
    {
        if(isBadVersion(i) == true && isBadVersion(i - 1) == false)
            return i;
    }
    return 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小辉_Super

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值