2021-10-22每日刷题打卡
力扣——每日一题
229. 求众数 II
给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋
次的元素。
示例 1:
输入:[3,2,3]
输出:[3]
设定一个unordered_map容器mymap来计算各个数字出现的次数,遍历nums,每次计算当前数字的出现次数。等遍历结束后,再遍历mymap,把出现次数大于nums.size()/3的元素存入vector容器里,最后返回vector容器。
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
vector<int>v;
unordered_map<int,int>mymap;
int n=nums.size();
for(int i=0;i<n;i++)
{
mymap[nums[i]]++;
}
n=n/3;
for(auto i:mymap)
{
if(i.second>n)
{
v.push_back(i.first);
}
}
return v;
}
};
278. 第一个错误的版本
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
示例 1:
输入:n = 5, bad = 4
输出:4
解释:
调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
二分查找,不同的是找的不是某个值而是一个分界线。设定两个值i=1,j=n。while遍历,当i>=j时结束循环,每次取i和j的中间值(不能是(i+j)/2,而是i+(j-i)/2),用给的接口判断,如果结果为true,就把值赋给j,反之赋给i,区间不断缩小,最后返回i或j就是要的结果。
// The API isBadVersion is defined for you.
// bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
int i=1,j=n;
while(i<j)
{
int num=i+(j-i)/2;
if(isBadVersion(num))
{
j=num;
}else
{
i=num+1;
}
}
return i;
}
};