我的第十次LeetCode周赛
心情
题目在此
有事没打,补题中😭 下一场还打不了 学校补课😭
第一题(执行操作后的变量值)
class Solution {
public:
int finalValueAfterOperations(vector<string>& o) {
int x = 0;
for (auto st:o){
if (st == "--X" || st == "X--")x--;
else x++;
}
return x;
}
};
第二题(数组美丽值求和)
维护一个从右向左的最小值数组。
从左到右的最大值可以在遍历中顺带就维护了。
class Solution {
public:
int sumOfBeauties(vector<int>& nums) {
int le = nums.size(),res = 0;
vector<int> mi(le);
int ma = nums[0];
mi[le-1] = nums[le-1];
for (int i = le - 2; i >= 0; i --){
if (mi[i+1] < nums[i]) mi[i] = mi[i+1];
else mi[i] = nums[i];
}
for (int i = 1; i <= le - 2; i ++){
if (ma < nums[i] && nums[i] < mi[i+1] ) res += 2;
else if (nums[i-1] < nums[i] && nums[i] < nums[i+1]) res += 1;
ma = max(ma,nums[i]);
}
return res;
}
};
第三题(检测正方形)
注意一点就好:不要忘记题目说的是检测正方形,不要老是想着检测矩形😤(如果是矩形会很麻烦的 )
class DetectSquares {
public:
vector<vector<int>> v = vector<vector<int>>(1010,vector(1010,0));
DetectSquares(){}
void add(vector<int> p) { v[p[0]][p[1]] ++; }
int count(vector<int> p) {
int res = 0;
for (int i = 0; i <= 1000; i ++){
if (i != p[1] && v[p[0]][i]){
int t = abs(i - p[1]);
if (p[0]+t<=1000)res += v[p[0]][i]*v[p[0]+t][i]*v[p[0]+t][p[1]];
if (0<=p[0]-t)res += v[p[0]][i]*v[p[0]-t][i]*v[p[0]-t][p[1]];
}
}
return res;
}
};
/**
* Your DetectSquares object will be instantiated and called as such:
* DetectSquares* obj = new DetectSquares();
* obj->add(point);
* int param_2 = obj->count(point);
*/
第四题(重复 K 次的最长子序列)
数据范围
n == s.length
2 <= k <= 2000
2 <= n < k * 8
通过数据范围,可以看出seq串长度范围
[
1
−
7
]
[1-7]
[1−7]
这样的话就可以暴力枚举所有子串了,当然也是要有技巧的枚举,只枚举那些有可能的字符串。
枚举时从长度小的并且符合条件的字符串进行枚举。(结合代码,进行理解)
class Solution {
public:
//检查字符串c是否符合题目要求
bool check(const string &c, const string &s, int k){
int n = s.length();
int m = c.length();
int j = 0, target = m * k;
for (int i = 0; i < n && j < target; i++)
if (c[j % m] == s[i]) j ++;
return j == target;
}
string longestSubsequenceRepeatedK(string s, int k) {
int n = s.length();
vector<vector<string>> savAns(8); //记录符合条件的字符串
savAns[0].push_back("");//初始化一下,为了后续的枚举
//枚举长度1-7的字符串
for (int l = 1; l <= 8; l++){
for (string &cur: savAns[l-1]){ //从长度-1的符合条件的字符串集中继续枚举字符串
for (char c = 'z'; c >= 'a'; c--){ //枚举26种字符,字典序大的在前面,为了方便记录字典序最大的字符串
string nxt = cur + c;
if (check(nxt, s, k)) //判断nxt这个字符串是否符合
savAns[l].push_back(nxt);
}
}
}
for (int l = 7; l >= 0; l--) //找到字符串长度最长的一个答案
if (savAns[l].size() > 0) return savAns[l][0];
return ""; //没有就返回空
}
};