1.20 LeetCode总结(基本算法)_模拟类

📅 2026/7/20 21:25:27
1.20 LeetCode总结(基本算法)_模拟类
编程总结每每刷完一道题后其思想和精妙之处没有地方记录本篇博客用以记录刷题过程中的遇到的算法和技巧1599. 经营摩天轮的最大利润intmaxi(intx,inty){returnxy?x:y;}intminOperationsMaxProfit(int*customers,intcustomersSize,intboardingCost,intrunningCost){if(boardingCost*4runningCost){return-1;}intcur0;// 当前时间等待人数登轮前intprofit0;//当前总利润intmax0;//最大利润持续更新intans0;//返回的最大转动次数//有人来的时间段先根据已有时间线按部就班进行转动for(inti0;icustomersSize;i){curcustomers[i];if(cur4){// 大于等于四个就四个一批处理profit4*boardingCost-runningCost;curcur-4;}else{// 小于4则清空人数profitcur*boardingCost-runningCost;cur0;}if(profitmax){ansi1;// 本次操作下来看利润能否增长是则更新答案}maxmaxi(profit,max);}//没有人来了以后处理剩下等待的人intc0;//记录转动次数while(cur4)//四个一批处理获取最大利润{profit4*boardingCost-runningCost;curcur-4;c;if(profitmax)//更新结果anscustomersSizec;maxmaxi(profit,max);//更新最大利润}if(cur4cur0cur*boardingCostrunningCost)// 处理落单的1-3人前提是能使利润正增长{profitcur*boardingCost-runningCost;cur0;if(profitmax)anscustomersSizec1;maxmaxi(profit,max);}if(ans0)//没有使利润0的情况返回-1return-1;returnans;}885. 螺旋矩阵 III在 rows x cols 的网格上你从单元格 (rStart, cStart) 面朝东面开始。网格的西北角位于第一行第一列网格的东南角位于最后一行最后一列。你需要以顺时针按螺旋状行走访问此网格中的每个位置。每当移动到网格的边界之外时需要继续在网格之外行走但稍后可能会返回到网格边界。最终我们到过网格的所有 rows x cols 个空间。按照访问顺序返回表示网格位置的坐标列表。提示1 rows, cols 1000 rStart rows0 cStart colsint**spiralMatrixIII(introws,intcols,intrStart,intcStart,int*returnSize,int**returnColumnSizes){inttotalrows*cols;// 分配结果空间int**ans(int**)malloc(sizeof(int*)*total);*returnColumnSizes(int*)malloc(sizeof(int)*total);*returnSizetotal;for(intk0;ktotal;k){ans[k](int*)malloc(sizeof(int)*2);(*returnColumnSizes)[k]2;}intxrStart;// 当前行坐标intycStart;// 当前列坐标intidx0;// 结果数组写入下标// 先存入起点ans[idx][0]x;ans[idx][1]y;idx;// r 当前圈层每一条边需要走的步数等价你代码的圈层半径rintr1;while(idxtotal){// 第一段向东 右走 r 步 (dy1) for(intstep0;stepridxtotal;step){yy1;// 判断当前坐标在网格内才存入答案if(x0xrowsy0ycols){ans[idx][0]x;ans[idx][1]y;idx;}}// 第二段向南 下走 r 步 (dx1) for(intstep0;stepridxtotal;step){xx1;if(x0xrowsy0ycols){ans[idx][0]x;ans[idx][1]y;idx;}}// 走完右、下两条边圈层扩大步数1r;// 第三段向西 左走 r 步 (dy-1) for(intstep0;stepridxtotal;step){yy-1;if(x0xrowsy0ycols){ans[idx][0]x;ans[idx][1]y;idx;}}// 第四段向北 上走 r 步 (dx-1) for(intstep0;stepridxtotal;step){xx-1;if(x0xrowsy0ycols){ans[idx][0]x;ans[idx][1]y;idx;}}// 走完左、上两条边圈层再扩大步数1r;}returnans;}