6136. 算术三元组的数目
题解:暴力枚举
class Solution {
public:
int arithmeticTriplets(vector<int>& nums, int diff) {
int n = nums.size();
int res = 0;
for(int i=0; i<n; i++)
for(int j = i+1; j<n; j++)
for(int k=j+1; k<n; k++){
if(nums[k]-nums[j] == diff && nums[j]-nums[i] == diff){
res++;
}
}
return res;
}
};
6139. 受限条件下可到达节点的数目
题解: BFS
class Solution {
public:
int reachableNodes(int n, vector<vector<int>>& edges, vector<int>& restricted) {
map<int, vector<int>> g;
for(auto e : edges){
g[e[0]].push_back(e[1]);
g[e[1]].push_back(e[0]);
}
set<int> hash;
for(auto r : restricted){
hash.insert(r);
}
queue<int> q;
q.push(0);
hash.insert(0);
int res = 1;
while(q.size()){
auto t = q.front();
q.pop();
for(auto c : g[t]){
if(!hash.count(c)){
q.push(c);
res++;
hash.insert(c);
}
}
}
return res;
}
};
6137. 检查数组是否存在有效划分
题解: 动态规划
状态表示:f[i] 表示前 i 个数是否能构成有效划分
f[i] = (f[i-1] && nums[i-1] == nums[i-2])
|| (f[i-3] && nums[i-1]==nums[i-2] && nums[i-3] == nums[i-2]) (i>=3)
|| (f[i-3] && nums[i-3]+1 == nums[i-2] && nums[i-2]+1 == nums[i-1]) (i>=3)
class Solution {
public:
bool validPartition(vector<int>& nums) {
int n = nums.size();
vector<bool> f(n+1);
f[0] = true;
f[1] = false;
for(int i=2; i<=n; i++){
f[i] = false;
if(nums[i-1] == nums[i-2] && f[i-2]){
f[i] = true;
}
if(i >=3 && nums[i-1] == nums[i-2] && nums[i-2] == nums[i-3] && f[i-3]){
f[i] = true;
}
if(i >= 3 && nums[i-1] == nums[i-2]+1 && nums[i-2] == nums[i-3]+1 && f[i-3]){
f[i] = true;
}
}
return f[n];
}
};
6138. 最长理想子序列
题解:动态规划
状态表示: 表示前 n 个字段 可以 结尾的最长理想子序列
动态方程:
class Solution {
public:
int longestIdealString(string s, int k) {
int n = s.size();
vector<vector<int>> f(n+1, vector<int>(26, 0));
for(int i=1; i<=n; i++){
int p = s[i-1]-'a';
f[i] = f[i-1]; // 其他字母结尾的复制过来
for(int j=0; j<26; j++){ // s[i-1] 结尾的字符进行比较
if(abs(j-p) <= k){
f[i][p] = max(f[i][p], f[i-1][j]+1);
}
}
}
int res = 0;
// 前 n 个字母, 26个字母结尾中最大长度
for(int i=0; i<26; i++){
res = max(res, f[n][i]);
}
return res;
}
};