1802. 有界数组中指定下标处的最大值
题目描述:
给你三个正整数 n、index 和 maxSum 。你需要构造一个同时满足下述所有条件的数组 nums(下标 从 0 开始 计数):
1、nums.length == n
2、nums[i] 是 正整数 ,其中 0 <= i < n
3、abs(nums[i] - nums[i+1]) <= 1 ,其中 0 <= i < n-1
4、nums 中所有元素之和不超过 maxSum
5、nums[index] 的值被 最大化
返回你所构造的数组中的 nums[index] 。
注意:abs(x) 等于 x 的前提是 x >= 0 ;否则,abs(x) 等于 -x 。
解题思路:
把每一个数当成一个砖块,目的是堆成形如三角形的台阶,使index所在处的台阶尽可能高。
先消耗n块砖让每个位置都有一块,双指针从index处向两边移动,每移动一次消耗right-left+1块砖,直至消耗完,若两个指针到达了边界,则用剩下的转判断能否整除n用于继续增高层数。
时间复杂度:O(n)
代码:
class Solution {
public:
int maxValue(int n, int index, int maxSum) {
int remain = maxSum - n;
int left = index;
int right = index;
int res = 1;
while (remain > 0) {
if (left > 0) left--;
if (right < n - 1) right++;
if (left <= 0 && right >= n - 1) {
res += remain % n == 0 ? remain / n : remain / n + 1;
return res;
}
res += 1;
remain -= (right - left + 1);
}
return res;
}
};
1807. 替换字符串中的括号内容
题目描述:
给你一个字符串 s ,它包含一些括号对,每个括号中包含一个 非空 的键。
比方说,字符串 “(name)is(age)yearsold” 中,有 两个 括号对,分别包含键 “name” 和 “age” 。
你知道许多键对应的值,这些关系由二维字符串数组 knowledge 表示,其中 knowledge[i] = [keyi, valuei] ,表示键 keyi 对应的值为 valuei 。
你需要替换 所有 的括号对。当你替换一个括号对,且它包含的键为 keyi 时,你需要:
将 keyi 和括号用对应的值 valuei 替换。
如果从 knowledge 中无法得知某个键对应的值,你需要将 keyi 和括号用问号 “?” 替换(不需要引号)。
knowledge 中每个键最多只会出现一次。s 中不会有嵌套的括号。
请你返回替换 所有 括号对后的结果字符串。
解题思路:
首先建立哈希表将knowledge中的key与value建立对应关系;
在字符串s中搜索’(‘与’)'中的字符串;
通过哈希表将搜索到的字符串进行对应value查找。
时间复杂度:O(n)
代码:
class Solution {
public:
string evaluate(string s, vector<vector<string>>& knowledge) {
unordered_map<string, string> mymap;
for (auto& it : knowledge) {
mymap[it[0]] = it[1];
}
string ans;
int index = 0;
while (index < s.length()) {
if (s[index] == '(') {
index++;
string midStr;
while (s[index] != ')') {
midStr.push_back(s[index]);
index++;
}
if (mymap.count(midStr)) ans += mymap[midStr];
else ans.push_back('?');
index++;
}
else {
ans.push_back(s[index]);
index++;
}
}
return ans;
}
};