花期内花的数目

题目
给你一个下标从 0 开始的二维整数数组 flowers ,其中 flowers[i] = [starti, endi] 表示第 i 朵花的 花期 从 starti 到 endi (都 包含)。同时给你一个下标从 0 开始大小为 n 的整数数组 persons ,persons[i] 是第 i 个人来看花的时间。

请你返回一个大小为 n 的整数数组 answer ,其中 answer[i]是第 i 个人到达时在花期内花的 数目 。

链接:https://leetcode.cn/problems/number-of-flowers-in-full-bloom
在这里插入图片描述

输入:flowers = [[1,6],[3,7],[9,12],[4,13]], persons = [2,3,7,11]
输出:[1,2,2,2]
解释:上图展示了每朵花的花期时间,和每个人的到达时间。
对每个人,我们返回他们到达时在花期内花的数目。

思路

1、哈希表+差分数组+前缀和
2、二分查找

代码

class Solution {
public:
    vector<int> fullBloomFlowers(vector<vector<int>>& flowers, vector<int>& persons) {

        // 暴力方法时间复杂度为O(n2)
        // 方法一、建立一个数组,该数组表示对应时刻花的数目
        // 告诉了区间端点,考虑使用差分数组,差分数组的初始值为0
        // 差分+哈希表+前缀和
        // 差分的前缀和就是原数组
        // 对应区间[i,j]增加a,差分数组mp[i]+=a,mp[j+1]-=a

        // map<int,int> mp;

        // for(auto& flower:flowers){
        //     mp[flower[0]]+=1;
        //     mp[flower[1]+1]-=1;
        // }

        // for(auto person:persons) mp[person];

        // int sum=0;
        // for(auto &[x,y]:mp){
        //     sum+=y;
        //     y=sum;
        // }

        // for(auto& person:persons)
        // person=mp[person];

        // return persons;

        // 方法二、使用二分查找,基于在某时刻看到的花,等于早于或者等于该时刻开放的花的数量减去早于该时刻结束的花的数量

        // 对应upper_bound()、lower_bound()

        vector<int> a;
        vector<int> b;

        for(vector<int>& flower:flowers){
            a.push_back(flower[0]);
            b.push_back(flower[1]);
        }

        sort(a.begin(),a.end());
        sort(b.begin(),b.end());

        vector<int> ans(persons.size());

        for(int i=0;i<persons.size();i++){

            ans[i]=upper_bound(a.begin(),a.end(),persons[i])-a.begin()-(lower_bound(b.begin(),b.end(),persons[i])-b.begin());
        }

        return ans;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值