leetcode 力扣 1184 拼车题解 算法题.docx
- 文档编号:10733536
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:16
- 大小:19.25KB
leetcode 力扣 1184 拼车题解 算法题.docx
《leetcode 力扣 1184 拼车题解 算法题.docx》由会员分享,可在线阅读,更多相关《leetcode 力扣 1184 拼车题解 算法题.docx(16页珍藏版)》请在冰豆网上搜索。
leetcode力扣1184拼车题解算法题
题目:
拼车
假设你是一位顺风车司机,车上最初有 capacity 个空座位可以用来载客。
由于道路的限制,车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向,你可以将其想象为一个向量)。
这儿有一份乘客行程计划表 trips[][],其中 trips[i]=[num_passengers,start_location,end_location] 包含了第i组乘客的行程信息:
•必须接送的乘客数量;
•乘客的上车地点;
•以及乘客的下车地点。
这些给出的地点位置是从你的 初始 出发位置向前行驶到这些地点所需的距离(它们一定在你的行驶方向上)。
请你根据给出的行程计划表和车子的座位数,来判断你的车是否可以顺利完成接送所有乘客的任务(当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回false)。
示例1:
输入:
trips=[[2,1,5],[3,3,7]],capacity=4
输出:
false
示例2:
输入:
trips=[[2,1,5],[3,3,7]],capacity=5
输出:
true
示例3:
输入:
trips=[[2,1,5],[3,5,7]],capacity=3
输出:
true
示例4:
输入:
trips=[[3,2,7],[3,7,9],[8,3,9]],capacity=11
输出:
true
提示:
•你可以假设乘客会自觉遵守“先下后上”的良好素质
•trips.length<=1000
•trips[i].length==3
•1<=trips[i][0]<=100
•0<=trips[i][1] •1<= capacity<=100000 语言: python fromtypingimportList importheapq classSolution: defcarPooling(self,trips: List[List[int]],capacity: int)->bool: trips.sort(key=lambdax: x[1]) off_dist=[] count=0 foriinrange(len(trips)): dist=trips[i][1] whileoff_distanddist>=off_dist[0][0]: _,passenger=heapq.heappop(off_dist) count-=passenger count+=trips[i][0] ifcount>capacity: returnFalse heapq.heappush(off_dist,[trips[i][-1],trips[i][0]]) returnTrue defcarPooling1(self,trips: List[List[int]],capacity: int)->bool: stop=[] forn,s,eintrips: stop.append([s,n]) stop.append([e,-n]) stop.sort() for_,countinstop: capacity-=count ifcapacity<0: returnFalse returnTrue 语言: python classSolution: defcarPooling(self,trips: List[List[int]],capacity: int)->bool: arr=[] fori,tripinenumerate(trips): arr.append((trip[1],trip[0])) arr.append((trip[2],-trip[0])) #排序时,位置为第一优先级,其次同一位置时先下车再上车 arr.sort(key=lambdax: (x[0],x[1])) #print(arr) preSum=0 forainarr: preSum+=a[1] ifpreSum>capacity: returnFalse returnTrue 语言: python classSolution: defcarPooling(self,trips: List[List[int]],capacity: int)->bool: #建立差分数组 diff=[0]*1001 forcnt,start,endintrips: diff[start]+=cnt diff[end]-=cnt #计算前缀和,其实更准确的说法叫做累积计数数组,即每个位置上累积的数量 preSum=0 foriinrange(1001): preSum+=diff[i] ifpreSum>capacity: returnFalse returnTrue 语言: cpp classSolution{ public: boolcarPooling(vector intn=trips.size(); //默认用最大数组1001 intd[1001]; memset(d,0,sizeof(d)); for(vector trips) { intcurr=trip[0]; d[trip[1]]+=curr; d[trip[2]]-=curr; } if(d[0]>capacity) { returnfalse; } //再次遍历去判断每个节点 for(inti=1;i<1001;++i) { d[i]+=d[i-1]; //cout< if(d[i]>capacity) { returnfalse; } } returntrue; } }; 语言: cpp classSolution{ public: constintstations=1001; boolcarPooling(vector intn=trips.size(); vector for(constauto&v: trips){ diff[v[1]]+=v[0]; diff[v[2]]-=v[0]; } intsum=0; for(inti=0;i sum+=diff[i]; if(sum>capacity)returnfalse; } returntrue; } }; 语言: cpp classSolution{ intb[1010]; public: boolcarPooling(vector intn=trips.size(); for(inti=0;i b[trips[i][1]]+=trips[i][0]; b[trips[i][2]]-=trips[i][0];//先下后上原则 } intx=b[0]; for(inti=1;i<=1000;i++){ b[i]+=b[i-1];//求前缀和 x=max(x,b[i]); } returncapacity>=x; } }; 语言: go funccarPooling(trips[][]int,capacityint)bool{ //建立差分数组 diff: =[]int{} fori: =0;i<1001;i++{ diff=append(diff,0) } for_,trip: =rangetrips{ diff[trip[1]]+=trip[0] diff[trip[2]]-=trip[0] } //计算前缀和 varpreSumint=0 fori: =0;i<1001;i++{ preSum+=diff[i] ifpreSum>capacity{ returnfalse } } returntrue } 语言: java classSolution{ publicbooleancarPooling(int[][]trips,intcapacity){ //按上车地点排序 PriorityQueue //按下车地点排序 PriorityQueue for(int[]trip: trips){ up.offer(trip); down.offer(trip); } intcur=capacity; while(! up.isEmpty()){ intstart=up.peek()[1]; intend=down.peek()[2]; if(start>=end){//下车 int[]trip=down.poll(); cur+=trip[0]; }else{//上车 int[]trip=up.poll(); cur-=trip[0]; if(cur<0){ returnfalse; } } } returntrue; } } 语言: java importjava.util.Arrays; importjava.util.Comparator; importjava.util.PriorityQueue; classSolution{ publicbooleancarPooling(int[][]trips,intcapacity){ //排序,重写排序方法 Arrays.sort(trips,CparingInt(o->o[1])); PriorityQueue //接上第一班人,并判断第一班人能不能全上车 Messageme=newMessage(trips[0][0],trips[0][1],trips[0][2]); capacity-=me.quantity; if(capacity<0){ returnfalse; } pq.offer(me); //过站并判断 for(inti=1;i //当前站点信息储存 Messagem=newMessage(trips[i][0],trips[i][1],trips[i][2]); //本站在上一站人的终点站之后后就是上一站的终点站,则先下车,空出车内空间 //本站人上车,并用总容量减去本站人数 if(m.start>=pq.peek().end){ while(! pq.isEmpty()&&m.start>=pq.peek().end){ Messagep=pq.poll(); capacity+=p.quantity; } pq.offer(m); capacity-=m.quantity; //本站在上一站的终点站前,只能直接上车 }else{ pq.offer(m); capacity-=m.quantity; } //若为负数,则超过本车容纳量,返回false if(capacity<0){ returnfalse; } } returntrue; } } classMessage{ intquantity; intstart; intend; publicMessage(intquantity,intstart,intend){ this.quantity=quantity; this.start=start; this.end=end; } } 语言: java classSolution{ publicbooleancarPooling(int[][]trips,intcapacity){ intm=trips.length; intmax=0; //找到最远的站点 for(int[]trip: trips){ max=Math.max(trip[2],max); } int[]diff=newint[max+1]; for(inti=0;i intnp=trips[i][0]; intsl=trips[i][1]; intel=trips[i][2]; //上车 diff[sl]+=np; //下车 diff[el]-=np; } intstart=diff[0]; if(start>capacity)returnfalse; //判断每一时刻下的乘客数量 for(inti=1;i<=max;i++){ start=start+diff[i]; if(start>capacity)returnfalse; } returntrue; } } 语言: php classSolution{ /** *@paramInteger[][]$trips *@paramInteger$capacity *@returnBoolean */ functioncarPooling($trips,$capacity){ /*$result=[]; $isOk=true; foreach($tripsas$row){ for($i=$row[1];$i<$row[2];$i++){ if(! isset($result[$i]))$result[$i]=0; if($result[$i]+$row[0]>$capacity){ $isOk=false; break; } $result[$i]+=$row[0]; } } return$isOk;*/ $isOk=true; $result=[]; //差分数组 //仅仅只需要计算出来左右区间的数值,进行加减,目的是为了维持差分的性质 foreach($tripsas$row){ if(! isset($result[$row[1]]))$result[$row[1]]=0; $result[$row[1]]+=$row[0]; if(! isset($result[$row[2]]))$result[$row[2]]=0; $result[$row[2]]-=$row[0]; } $cur=0; for($i=0;$i<1001;$i++){//这里写1001的因为要所有的都需要轮训,不要改成count($result)不信你试试 $cur+=$result[$i]; if($cur>$capacity){ $isOk=false; break; } } return$isOk; } } 语言: javascript functionDifference(nums){ //差分数组 this.diff=newArray(nums.length).fill(0); //根据初始数组构建差分数组 for(leti=1;i this.diff[i]=nums[i]-nums[i-1]; } //给闭区间[i,j]增加val(可以是负数) this.increment=function(i,j,val){ this.diff[i]+=val; if(j+1 this.diff[j+1]-=val; } }; this.result=function(){ letres=newArray(this.diff.length).fill(0); res[0]=this.diff[0]; for(leti=1;i res[i]=res[i-1]+this.diff[i]; } returnres; }; } /** *@param{number[][]}trips *@param{number}capacity *@return{boolean} */ varcarPooling=function(trips,capacity){ //最多有1000个车站 letnums=newArray(1001).fill(0); //构建差分数组 letdf=newDifference(nums); for(lettripoftrips){ //乘客数量 letval=trip[0]; //第trip[1]站乘客上车 leti=trip[1]; //第trip[2]站乘客已经下车,即乘客在车上的区间是[trip[1],trip[2-1]] letj=trip[2]-1; df.increment(i,j,val); } letres=df.result(); for(leti=0;i if(capacity returnfalse; } } returntrue; };
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- leetcode 力扣 1184 拼车 题解 算法题 算法