企业网站建设服务内容瑞安营销网站建设
web/
2025/10/3 0:02:35/
文章来源:
企业网站建设服务内容,瑞安营销网站建设,wordpress 成绩管理,好网站求推荐文章目录1. 比赛结果2. 题目1. LeetCode 5420. 商品折扣后的最终价格 easy2. LeetCode 5422. 子矩形查询 medium3. LeetCode 5423. 找两个和为目标值且不重叠的子数组 medium4. LeetCode 5421. 安排邮筒 hard1. 比赛结果
两题选手#x1f602;#xff0c;前两题很水#xf…
文章目录1. 比赛结果2. 题目1. LeetCode 5420. 商品折扣后的最终价格 easy2. LeetCode 5422. 子矩形查询 medium3. LeetCode 5423. 找两个和为目标值且不重叠的子数组 medium4. LeetCode 5421. 安排邮筒 hard1. 比赛结果
两题选手前两题很水暴力解题拼手速第三题超时第四题不太会继续加油
全国排名 505 / 214423.6%全球排名 1944 / 857122.7%
2. 题目
1. LeetCode 5420. 商品折扣后的最终价格 easy
题目链接 给你一个数组 prices 其中 prices[i] 是商店里第 i 件商品的价格。
商店里正在进行促销活动如果你要买第 i 件商品那么你可以得到与 prices[j] 相等的折扣其中 j 是满足 j i 且 prices[j] prices[i] 的 最小下标 如果没有满足条件的 j 你将没有任何折扣。
请你返回一个数组数组中第 i 个元素是折扣后你购买商品 i 最终需要支付的价格。
示例 1
输入prices [8,4,6,2,3]
输出[4,2,4,2,3]
解释
商品 0 的价格为 price[0]8 你将得到 prices[1]4 的折扣所以最终价格为 8 - 4 4 。
商品 1 的价格为 price[1]4 你将得到 prices[3]2 的折扣所以最终价格为 4 - 2 2 。
商品 2 的价格为 price[2]6 你将得到 prices[3]2 的折扣所以最终价格为 6 - 2 4 。
商品 3 和 4 都没有折扣。示例 2
输入prices [1,2,3,4,5]
输出[1,2,3,4,5]
解释在这个例子中所有商品都没有折扣。示例 3
输入prices [10,1,1,6]
输出[9,0,1,6]提示
1 prices.length 500
1 prices[i] 10^3解题
读懂题目就可以了
class Solution {//C
public:vectorint finalPrices(vectorint prices) {int i, j, n prices.size();for(i 0; i n-1; i){for(j i1; j n; j){if(prices[j] prices[i]){prices[i] - prices[j];break;}}}return prices;}
};4 ms 9.9 MB
class Solution:# py3def finalPrices(self, prices: List[int]) - List[int]:n len(prices)for i in range(n-1):for j in range(i1,n):if prices[j] prices[i]:prices[i] - prices[j]break;return prices44 ms 13.7 MB
数据规模大的话需要用单调栈
class Solution { //C
public:vectorint finalPrices(vectorint prices) {int i, n prices.size();stackint stk;vectorint ans(prices);for(i n-1; i 0; --i){while(!stk.empty() prices[i] prices[stk.top()])stk.pop();if(!stk.empty())ans[i] - prices[stk.top()];stk.push(i);}return ans;}
};2. LeetCode 5422. 子矩形查询 medium
题目链接 请你实现一个类 SubrectangleQueries 它的构造函数的参数是一个 rows x cols 的矩形这里用整数矩阵表示并支持以下两种操作
updateSubrectangle(int row1, int col1, int row2, int col2, int newValue) 用 newValue 更新以 (row1,col1) 为左上角且以 (row2,col2) 为右下角的子矩形。getValue(int row, int col) 返回矩形中坐标 (row,col) 的当前值。
示例 1
输入
[SubrectangleQueries,getValue,updateSubrectangle,
getValue,getValue,updateSubrectangle,getValue,getValue]
[[[[1,2,1],[4,3,4],[3,2,1],[1,1,1]]],[0,2],[0,0,3,2,5],[0,2],[3,1],[3,0,3,2,10],[3,1],[0,2]]
输出
[null,1,null,5,5,null,10,5]
解释
SubrectangleQueries subrectangleQueries new SubrectangleQueries([[1,2,1],[4,3,4],[3,2,1],[1,1,1]]);
// 初始的 (4x3) 矩形如下
// 1 2 1
// 4 3 4
// 3 2 1
// 1 1 1
subrectangleQueries.getValue(0, 2); // 返回 1
subrectangleQueries.updateSubrectangle(0, 0, 3, 2, 5);
// 此次更新后矩形变为
// 5 5 5
// 5 5 5
// 5 5 5
// 5 5 5
subrectangleQueries.getValue(0, 2); // 返回 5
subrectangleQueries.getValue(3, 1); // 返回 5
subrectangleQueries.updateSubrectangle(3, 0, 3, 2, 10);
// 此次更新后矩形变为
// 5 5 5
// 5 5 5
// 5 5 5
// 10 10 10
subrectangleQueries.getValue(3, 1); // 返回 10
subrectangleQueries.getValue(0, 2); // 返回 5示例 2
输入
[SubrectangleQueries,getValue,updateSubrectangle,
getValue,getValue,updateSubrectangle,getValue]
[[[[1,1,1],[2,2,2],[3,3,3]]],[0,0],[0,0,2,2,100],[0,0],[2,2],[1,1,2,2,20],[2,2]]
输出
[null,1,null,100,100,null,20]
解释
SubrectangleQueries subrectangleQueries new SubrectangleQueries([[1,1,1],[2,2,2],[3,3,3]]);
subrectangleQueries.getValue(0, 0); // 返回 1
subrectangleQueries.updateSubrectangle(0, 0, 2, 2, 100);
subrectangleQueries.getValue(0, 0); // 返回 100
subrectangleQueries.getValue(2, 2); // 返回 100
subrectangleQueries.updateSubrectangle(1, 1, 2, 2, 20);
subrectangleQueries.getValue(2, 2); // 返回 20提示
最多有 500 次updateSubrectangle 和 getValue 操作。
1 rows, cols 100
rows rectangle.length
cols rectangle[i].length
0 row1 row2 rows
0 col1 col2 cols
1 newValue, rectangle[i][j] 10^9
0 row rows
0 col cols解题
暴力更新
class SubrectangleQueries {//Cvectorvectorint v;
public:SubrectangleQueries(vectorvectorint rectangle) {v rectangle;}void updateSubrectangle(int row1, int col1, int row2, int col2, int newValue) {int i,j;for(i row1; i row2; i)for(j col1; j col2; j)v[i][j] newValue;}int getValue(int row, int col) {return v[row][col];}
};84 ms 18.6 MB
或者不用更新直接逆序查历史记录
class SubrectangleQueries {vectorvectorint record;vectorvectorint v;
public:SubrectangleQueries(vectorvectorint rectangle) {v rectangle;}void updateSubrectangle(int row1, int col1, int row2, int col2, int newValue) {record.push_back({row1,col1,row2,col2,newValue});}int getValue(int row, int col) {for(int i record.size()-1; i 0; --i){if(rowrecord[i][0] rowrecord[i][2] colrecord[i][1] colrecord[i][3])return record[i][4];}return v[row][col];}
};84 ms 19.2 MB
class SubrectangleQueries:# py3def __init__(self, rectangle: List[List[int]]):import numpy as npself.rec np.array(rectangle)def updateSubrectangle(self, row1: int, col1: int, row2: int, col2: int, newValue: int) - None:self.rec[row1:row21, col1:col21] newValuedef getValue(self, row: int, col: int) - int:return int(self.rec[row][col])140 ms 30.2 MB
3. LeetCode 5423. 找两个和为目标值且不重叠的子数组 medium
题目链接 给你一个整数数组 arr 和一个整数值 target 。
请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target 。 可能会有多种方案请你返回满足要求的两个子数组长度和的 最小值 。
请返回满足要求的最小长度和如果无法找到这样的两个子数组请返回 -1 。
示例 1
输入arr [3,2,2,4,3], target 3
输出2
解释只有两个子数组和为 3 [3] 和 [3]。它们的长度和为 2 。示例 2
输入arr [7,3,4,7], target 7
输出2
解释尽管我们有 3 个互不重叠的子数组和为 7 [7], [3,4] 和 [7]
但我们会选择第一个和第三个子数组因为它们的长度和 2 是最小值。示例 3
输入arr [4,3,2,6,2,3,4], target 6
输出-1
解释我们只有一个和为 6 的子数组。示例 4
输入arr [5,5,4,4,5], target 3
输出-1
解释我们无法找到和为 3 的子数组。示例 5
输入arr [3,1,1,1,5,1,2,1], target 3
输出3
解释注意子数组 [1,2] 和 [2,1] 不能成为一个方案因为它们重叠了。提示
1 arr.length 10^5
1 arr[i] 1000
1 target 10^8解题
先通过滑动窗口求出所有的区间注意 使用multiset时才能保存长度一样的然后在区间里双重循环内层找到一个解的时候就 break然后外层循环 注意剪枝
struct cmp
{bool operator()(const pairint,int a, const pairint,int b)const{return a.second-a.first b.second-b.first;// 或者使用 set 但是这里要加入 号但是这是个很不好的// set就是去重的你弄个相同的在里面很让人迷惑}
};
class Solution {
public:int minSumOfLengths(vectorint arr, int target) {int i0, j0, n arr.size(), sum 0;int minlen INT_MAX;multisetpairint,int,cmp v;for(;j n; j){sum arr[j];if(sumtarget)v.insert({i,j});while(sum target){sum - arr[i];if(sumtarget)v.insert({i,j});}}for(auto it1 v.begin(); it1 ! v.end(); it1){if(2*(it1-second-it1-first1) minlen)break;//记得优化容易超时auto it2 it1;for(it2; it2 ! v.end(); it2){if(it1-second it2-first || it1-first it2-second){minlen min(minlen, it1-second - it1-firstit2-second - it2-first2);break;//找到了一个解break后面不会有更优的}}}return minlenINT_MAX?-1:minlen;}
};516 ms 87.8 MB
利用前缀和分别记录每个位置左侧的最短长度右侧的最短长度再遍历一次求解最短的 lr
class Solution {
public:int minSumOfLengths(vectorint arr, int target) {int i, n arr.size(), sum 0, minlen INT_MAX;unordered_mapint,int m;//前缀和indexm[0] -1;vectorint left(n,0);vectorint right(n,0);for(i 0; i n; i){sum arr[i];m[sum] i;if(m.count(sum-target))minlen min(minlen, i-m[sum-target]);left[i] minlen;}unordered_mapint,int m1;//前缀和indexm1[0] n;sum 0;minlen INT_MAX;for(i n-1; i 0; --i){sum arr[i];m1[sum] i;if(m1.count(sum-target))minlen min(minlen, m1[sum-target]-i);right[i] minlen;}minlen INT_MAX;for(i 0; i n-1; i)if(left[i]!INT_MAX right[i1]!INT_MAX)//左右都存在minlen min(minlen, left[i]right[i1]);return minlenINT_MAX?-1:minlen;}
};1172 ms 164.8 MB
4. LeetCode 5421. 安排邮筒 hard
题目链接 给你一个房屋数组houses 和一个整数 k 其中 houses[i] 是第 i 栋房子在一条街上的位置现需要在这条街上安排 k 个邮筒。
请你返回每栋房子与离它最近的邮筒之间的距离的 最小 总和。
答案保证在 32 位有符号整数范围以内。
示例 1
输入houses [1,4,8,10,20], k 3
输出5
解释将邮筒分别安放在位置 3 9 和 20 处。
每个房子到最近邮筒的距离和为 |3-1| |4-3| |9-8| |10-9| |20-20| 5 。示例 2
输入houses [2,3,5,12,18], k 2
输出9
解释将邮筒分别安放在位置 3 和 14 处。
每个房子到最近邮筒距离和为 |2-3| |3-3| |5-3| |12-14| |18-14| 9 。示例 3
输入houses [7,4,6,1], k 1
输出8示例 4
输入houses [3,6,14,10], k 4
输出0提示
n houses.length
1 n 100
1 houses[i] 10^4
1 k n
数组 houses 中的整数互不相同。解题
待补
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85901.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!