6167. 检查相同字母间的距离
简单的遍历,注意每个字母只能遍历一遍,第二次遍历时要跳过,所以需要用一个哈希表来记录
代码实现(自解)
class Solution {
public:
bool checkDistances(string s, vector<int>& distance) {
set<char> mySet;
for (int i = 0; i < s.size(); i++) {
if (mySet.count(s[i])) continue;
mySet.emplace(s[i]);
int j;
for (j = i + 1; j < s.size(); j++) {
if (s[j] == s[i]) break;
}
if (j - i - 1 != distance[s[i] - 'a']) return false;
}
return true;
}
};
6168. 恰好移动 k 步到达某一位置的方法数目
动态规划,记录走k步时,到达任意位置的情况(状态),状态转移就是前一步走到该位置相邻位置方案的加和
代码实现(自解)
class Solution {
private:
const int num = 1000000007;
public:
int numberOfWays(int startPos, int endPos, int k) {
int diff = endPos - startPos;
if ((k - abs(diff)) % 2 || abs(diff) > k) return 0;
// if (k == diff) return 1;
vector<vector<long long>> dp(k + 1, vector<long long>(2 * k + 1));
dp[0][k] = 1;
for (int i = 1; i <= k; i++) {
for (int j = 0; j < 2 * k + 1; j++) {
if (j == 0) {
dp[i][j] = dp[i - 1][j + 1] % num;
}
else if (j == 2 * k) {
dp[i][j] = dp[i - 1][j - 1] % num;
}
else {
dp[i][j] = dp[i - 1][j - 1] % num + dp[i - 1][j + 1] % num;
}
// cout << dp[i][j];
}
// cout << endl;
}
return dp[k][k + diff] % num;
}
};
6169. 最长优雅子数组
贪心,如果位运算结果为0,那么与该元素相或,然后继续,直到找到一个位运算相与为0的元素,计算长度
代码实现(自解)
class Solution {
public:
int longestNiceSubarray(vector<int>& nums) {
/*
int pre = 0, nex = 1;
int ans = 1;
for (int i = 0; i < nums.size(); i++) {
int total = nums[pre];
while (nex != nums.size() && !(total & nums[nex])) {
total = total | nums[nex];
nex++;
}
ans = max(ans, nex - pre);
int tmp = pre + 1;
while (!(nums[tmp] & nums[nex])) tmp++;
nex = min(nex, tmp + 1);
i = nex;
pre = nex;
nex = nex + 1;
}
return ans;
*/
int ans = 1;
for (int i = 0; i < nums.size(); i++) {
int total = nums[i];
int j;
for (j = i + 1; j < nums.size(); j++) {
if (!(total & nums[j])) {
total = nums[j] | total;
continue;
}
break;
}
ans = max(j - i, ans);
}
return ans;
}
};
6170. 会议室 III
写出来了正确的方法,但是超时了,正确的思路应该按每个会议做一次遍历,我是按每个时间来的,所以错了,这里分享一篇我觉得写得很好的。
基本思路就是模拟了,模拟的细节和数据结构的选用要想清楚,下次继续努力吧!