一、1418. 点菜展示表
1.原题链接
2.题目描述
给你一个数组 orders,表示客户在餐厅中完成的订单,确切地说, orders[i]=[customerNamei,tableNumberi,foodItemi] ,其中 customerNamei 是客户的姓名,tableNumberi 是客户所在餐桌的桌号,而 foodItemi 是客户点的餐品名称。请你返回该餐厅的 点菜展示表 。在这张表中,表中第一行为标题,其第一列为餐桌桌号 “Table” ,后面每一列都是按字母顺序排列的餐品名称。接下来每一行中的项则表示每张餐桌订购的相应餐品数量,第一列应当填对应的桌号,后面依次填写下单的餐品数量。注意:客户姓名不是点菜展示表的一部分。此外,表中的数据行应该按餐桌桌号升序排列。
3.解题思路
有序集合
4.源码
class Solution {
public:
vector<vector<string>> displayTable(vector<vector<string>>& orders) {
set<string> foodList;
map<int, map<string, int>> tableList;
for (auto& o : orders) {
foodList.insert(o[2]);
tableList[stoi(o[1])][o[2]]++;
}
vector<vector<string>> ans;
vector<string> title = { "Table" };
for (auto& s : foodList) {
title.push_back(s);
}
ans.push_back(title);
for (auto& p : tableList) {
vector<string> t = { to_string(p.first) };
for (auto& s : foodList) {
t.push_back(to_string(p.second[s]));
}
ans.push_back(t);
}
return ans;
}
};
二、363. 矩形区域不超过 K 的最大数值和
1.原题链接
2.题目描述
给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。题目数据保证总会存在一个数值和不超过 k 的矩形区域。
3.解题思路
有序集合
4.源码
class Solution {
public:
int maxSumSubmatrix(vector<vector<int>> &matrix, int k) {
int ans = INT_MIN;
int m = matrix.size(), n = matrix[0].size();
for (int i = 0; i < m; ++i) {
vector<int> sum(n);
for (int j = i; j < m; ++j) {
for (int c = 0; c < n; ++c) {
sum[c] += matrix[j][c];
}
set<int> sumSet{0};
int s = 0;
for (int v : sum) {
s += v;
auto lb = sumSet.lower_bound(s - k);
if (lb != sumSet.end()) {
ans = max(ans, s - *lb);
}
sumSet.insert(s);
}
}
}
return ans;
}
};
总结
第二十二天,今天题目还是有难度,需要好好消化。