#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
using namespace std;
/*
问题:
You are a product manager and currently leading a team to develop a new product. Unfortunately,
the latest version of your product fails the quality check. Since each version is developed based on the previous version, all the versions
after a bad version are also bad.
Suppose you have n versions [1, 2, ..., n] and you want to find out the first bad one,
which causes all the following ones to be bad.
You are given an API bool isBadVersion(version) which will return whether version is bad.
Implement a function to find the first bad version. You should minimize the number of calls to the API.
分析:发现一个版本号是否是坏的版本,确保调用次数最少
被调函数要实现根据给定的版本号,找到首先是最坏的版本。最坏的版本号的特点是当前及其之后版本号都是属于坏的版本。
没有给出条件说明什么是坏的版本啊,仅仅一个数字没有办法判断
举例:
1 2 3 4 5 个版本中,第三个版本是起始坏的,那么3 4 5都是坏的,
应该是从后向前遍历,比如判断版本5是否是坏的,需要判断当前版本及之后版本是否都是坏的
最后一个版本是坏的,然后判断4以及之后的5是否是坏的
3,需要判断3本身是否是坏的,(既然能走到判定3,说明其之后版本一定都是坏的)
如果是第一个版本就是好的,说明没有坏的版本‘
如果第一个版本是坏的
总结:就是从后向前依次遍历,时间复杂度为O(n)
明确:出现: "好坏" 这种的时候的"坏"即为第一次出现的版本
如果假设好为0,坏为1,就是寻找类似00001111中1首次出现的位置
就是一个lower_bound的问题:寻找某数字第一次出现的位置,或者如果没有该位置,返回
的位置插入该元素仍然使得序列有序。
中间元素< 给定值:在右侧,不包含中间元素,low = mid +1
中间元素 = 给定值:在给定元素的左侧,包含中间,high = mid
中间元素 > 给定值,在给定元素的左侧,不包含中间值,high=mid-1
对于此题:
中间元素是好的
报错:超时。
Last executed input:
1926205968 versions
1167880583 is the first bad version.
关键:
1 说明:既然是整个数组,那么采用二分法,找到中间部分,中间部分如果是好的版本
中间是好的版本:在后半段,low=mid+1
中间是坏的版本:1】如果中间元素前面一个元素是好的(如果中间元素前面没有元素,就是当前元素),找到了,否则转2】
2】可能在包含中间部分的前面部分,high=mid
*/
bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
if(n < 1)
{
return 0;
}
int mid;
int low = 1;
int high = n;
while(low < high)
{
mid = low + (high - low) / 2;
//中间元素是好的,在后面半段
if(!isBadVersion(mid))
{
low = mid + 1;
}
else
{
//如果找到了
if( 1 == mid || (!isBadVersion(mid - 1) ) )
{
return mid;
}
//如果没有找到
else
{
high = mid;
}
}
}
if(low != 1)
{
if(isBadVersion(low) && (!isBadVersion(low-1)) )
{
return low;
}
}
else
{
if(isBadVersion(low))
{
return low;
}
}
return 0;
}
};
void print(vector<int>& result)
{
if(result.empty())
{
cout << "no result" << endl;
return;
}
int size = result.size();
for(int i = 0 ; i < size ; i++)
{
cout << result.at(i) << " " ;
}
cout << endl;
}
void process()
{
vector<int> nums;
int value;
int num;
Solution solution;
vector<int> result;
while(cin >> num )
{
nums.clear();
for(int i = 0 ; i < num ; i++)
{
cin >> value;
nums.push_back(value);
}
}
}
int main(int argc , char* argv[])
{
process();
getchar();
return 0;
}
/*
int firstBadVersion2(int n) {
//从后向前遍历,判断当前版本是否是坏的,如果是坏的,还要继续向前遍历
//找到当前版本是坏的,当前版本的前一个版本是好的,此时当前版本就是所求
int i;
for(i = n ; i >= 2 ; i--)
{
//当前版本是坏的,前一个版本是好的,说明就是当前版本
if( isBadVersion(i) )
{
//如果前面一个版本是好的,说明是当前版本
if( !isBadVersion(i-1) )
{
return i;
}
//前面一个版本是坏的,需要继续遍历
else
{
}
}
//如果当前版本是好的,说明该版本不是的,停止遍历,不存在
else
{
return 0;
}
}
return i;
}
*/
leecode 解题总结:278. First Bad Version
最新推荐文章于 2025-06-12 08:09:10 发布
