深入Linux USB驱动框架:从虚拟控制器dummy_hcd到USB/IP的vhci-hcd(附代码导读)
2026/5/10 10:06:50
这道题是经典的差分 + 排序 + 二分问题,非常高频,最优解法时间复杂度O(n log n + m log n)。
flowers[i] = [start, end]:花从start到end每天都开放people[i]:人到达的时间start位置 +1end + 1位置 -1(因为 end 当天还开着)importjava.util.*;classSolution{publicint[]fullBloomFlowers(int[][]flowers,int[]people){intn=flowers.length;intm=people.length;// 1. 收集花开、花谢时间int[]starts=newint[n];int[]ends=newint[n];for(inti=0;i<n;i++){starts[i]=flowers[i][0];ends[i]=flowers[i][1];}// 2. 排序Arrays.sort(starts);Arrays.sort(ends);// 3. 对每个人:二分查找 <= time 的花开数量 - 小于 time 的花谢数量int[]res=newint[m];for(inti=0;i<m;i++){inttime=people[i];// 花开 <= time:有多少朵intbloom=upperBound(starts,time);// 花谢 < time:有多少朵intfall=lowerBound(ends,time);res[i]=bloom-fall;}returnres;}// 找 <= target 的最后一个位置 +1(总数)privateintupperBound(int[]arr,inttarget){intl=0,r=arr.length;while(l<r){intmid=l+(r-l)/2;if(arr[mid]<=target){l=mid+1;}else{r=mid;}}returnl;}// 找 < target 的第一个位置(总数)privateintlowerBound(int[]arr,inttarget){intl=0,r=arr.length;while(l<r){intmid=l+(r-l)/2;if(arr[mid]<target){l=mid+1;}else{r=mid;}}returnl;}}对某个人到达时间time:
开放花数 = 已经开放的花数量 - 已经凋谢的花数量
已经开放 = 花开时间 ≤ time已经凋谢 = 花谢时间 < time(end 当天仍开放)这是最优解法,能轻松通过题目最大数据量。
需要我给你讲差分法版本(更直观的区间计数思路)吗?