【每日刷题】Day134
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
1. 1218. 最长定差子序列 - 力扣(LeetCode)
2. LCR 116. 省份数量 - 力扣(LeetCode)
3. 990. 等式方程的可满足性 - 力扣(LeetCode)
1. 1218. 最长定差子序列 - 力扣(LeetCode)
//思路:动态规划+哈希表
class Solution {
public:
int longestSubsequence(vector<int>& arr, int difference)
{
int n = arr.size(),ans = 1;
unordered_map<int,int> hash;
hash[arr[0]] = 1;
for(int i = 1;i<n;i++)
{
hash[arr[i]] = hash[arr[i]-difference]+1;//以 arr[i] 为 key,dp[i] 为value
ans = ans>hash[arr[i]]?ans:hash[arr[i]];
}
return ans;
}
};
2. LCR 116. 省份数量 - 力扣(LeetCode)
//思路:并查集
class Solution {
public:
int findCircleNum(vector<vector<int>>& isConnected)
{
int ans = 0;
vector<int> ufs(isConnected.size(),-1);
auto findRoot = [&ufs](int x)//寻根 Lambda 表达式
{
while(ufs[x]>=0) x = ufs[x];
return x;
};
for(int i = 0;i<isConnected.size();i++)
{
for(int j = 0;j<isConnected[i].size();j++)
{
if(isConnected[i][j])
{
int root1 = findRoot(i);
int root2 = findRoot(j);
if(root1!=root2)//将 j 城市并入 i 城市中
{
ufs[root1]+=ufs[root2];
ufs[root2] = root1;
}
}
}
}
for(int i = 0;i<ufs.size();i++)
{
if(ufs[i]<0) ans++;
}
return ans;
}
};
3. 990. 等式方程的可满足性 - 力扣(LeetCode)
//思路:并查集
class Solution {
public:
bool equationsPossible(vector<string>& equations)
{
vector<int> ufs(26,-1);
auto findRoot = [&ufs](int x)//寻根 Lambda 表达式
{
while(ufs[x]>=0) x = ufs[x];//存储值为负数的是根
return x;
};
//相等放入同一集合
for(auto str:equations)
{
if(str[1]=='=')
{
int root1 = findRoot(str[0]-'a');//注意'a'映射0,'b'映射1,以此类推
int root2 = findRoot(str[3]-'a');
if(root1!=root2)
{
ufs[root1]+=ufs[root2];
ufs[root2] = root1;
}
}
}
//不相等判断是否在同一个集合,如果在则相悖
for(auto str:equations)
{
if(str[1]=='!')
{
int root1 = findRoot(str[0]-'a');
int root2 = findRoot(str[3]-'a');
if(root1==root2) return false;//相悖
}
}
return true;
}
};