资讯动态

leetcode 1648. 销售价值减少的颜色球-耗时99

发布时间:2026/8/28 3:30:48 来源:尧图企业网站定制
Problem: 1648. 销售价值减少的颜色球耗时99%二分查找的将整个数组看作是柱状图然后水平线yy0平行于x轴切割柱状图上侧的数字个数应该满足orders但实际情况不可能所以首先找到最符合的数字mid最小值l0最大值r数组的最大值-1l和r都是分割的上边界像[2,5]若用4分割则和是5若用3分割和是549若用2分割和是54312若用1分割和是5432216对每个中值mid求出上侧的数字个数getNum(inventory, mid)二分查找到的结果mid然后若num orders就不停累加mid直到num orders此时只需要在分割水平线下侧累加几个最大值即可考虑到可能存在极小值这些极小值不能用来累加需要满足 inventory[i] mid此时mid–递减的Codeclass Solution { public: const int mod 1e9 7; const int con 1e9; int getNum(vectorint inventory, int mid) { long long num 0; for(int i : inventory) { if(i mid) num i - mid; } if(num con) return INT_MAX; return num; } int maxProfit(vectorint inventory, int orders) { int mx *max_element(inventory.begin(), inventory.end()); int n inventory.size(); unsigned long long l 0, r mx - 1, mid, num, sum 0; while(l r) { mid (l r) / 2; if(getNum(inventory, mid) orders) { r mid - 1; } else { l mid 1; } } num getNum(inventory, mid); while(num orders) { num getNum(inventory, mid); } num 0; for(int i : inventory) { if(i mid) { num i - mid; sum (sum (i (mid 1)) * (i - mid) / 2) % mod; i mid; } } num orders - num; if(num 0) return sum; while(true) { mid--; for(int i : inventory) { if(i mid) { sum (sum i) % mod; i--; num--; } if(num 0) return sum; } } return -1; } };

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价