2021-10-22每日刷题打卡

本文介绍了如何运用二分查找算法解决两个编程问题:一是找到数组中出现次数超过数组长度三分之一的众数;二是找到导致所有版本出错的第一个错误版本。对于众数问题,通过unordered_map统计每个数字的频率,然后筛选出超过阈值的元素。对于错误版本问题,采用二分查找逐步缩小范围,直至找到第一个错误的版本。
摘要由CSDN通过智能技术生成

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值