【2022/03/20-第285场单周赛】复盘

总结
Q1.统计数组中峰和谷的数量
把连续的相同数字合并,然后找峰和谷。
class Solution {
public:
int countHillValley(vector<int>& nums) {
int ret = 0, pre = 0;
vector<int> v;
for(int i = 0; i < nums.size(); ++i){
if(nums[i] != pre) v.push_back(nums[i]);
pre = nums[i];
}
for(int i = 1; i < v.size() - 1; ++i){
int l = v[i - 1], r = v[i + 1];
if((v[i] > l && v[i] > r) || (v[i] < l && v[i] < r)) ++ret;
}
return ret;
}
};
Q2.统计道路上的碰撞次数
对于L,只要左边有S或者R就必定会撞。
对于R,只要右边有S或者L就必定会撞。
对于S,不计入结果。
class Solution {
public:
int countCollisions(string s) {
int n = s.size();
int rl = 0, rr = 0, rs = 0, ll = 0, ls = 0, lr = 0;
for(auto i : s){
if(i == 'L') ++rl;
if(i == 'R') ++rr;
if(i == 'S') ++rs;
}
int ret = 0;
for(int i = 0; i < n; ++i){
if(s[i] == 'L'){
--rl;
++ll;
if(ls + lr > 0) ++ret;
}
if(s[i] == 'R'){
--rr;
++lr;
if(rs + rl > 0) ++ret;
}
if(s[i] == 'S'){
--rs;
++ls;
}
}
return ret;
}
};
Q3.射箭比赛中的最大得分
对每个得分位置dfs。
class Solution {
public:
int mx = 0;
void dfs(int index, int rest, int score, vector<int> &ret, vector<int> &temp, vector<int> &alice){
if(index == 0){
if(score > mx){
mx = score;
temp[0] = rest;
ret = temp;
temp[0] = 0;
}
return ;
}
if(rest > alice[index]){
temp[index] = alice[index] + 1;
dfs(index - 1, rest - alice[index] - 1, score + index, ret, temp, alice);
temp[index] = 0;
}
dfs(index - 1, rest, score, ret, temp, alice);
}
vector<int> maximumBobPoints(int numArrows, vector<int>& aliceArrows) {
vector<int> ret(12, 0), temp(12, 0);
dfs(11, numArrows, 0, ret, temp, aliceArrows);
return ret;
}
};
Q4.由单个字符重复的最长子字符串
线段树应用,先放着。
浙公网安备 33010602011771号