A 找到兩個數組中的公共元素
模擬
class Solution {
public:vector<int> findIntersectionValues(vector<int> &nums1, vector<int> &nums2) {unordered_set<int> s1(nums1.begin(), nums1.end()), s2(nums2.begin(), nums2.end());vector<int> res(2);for (auto x: nums1)if (s2.count(x))res[0]++;for (auto x: nums2)if (s1.count(x))res[1]++;return res;}
};
B 消除相鄰近似相等字符
動態規劃:設 p [ i ] [ j ] p[i][j] p[i][j] 為將 w o r d [ 0 , i ] word[0,i] word[0,i] 修改為末位為 j j j 的不含相鄰近似相等字符串的最少操作數,枚舉可能的 w o r d [ i ? 1 ] word[i-1] word[i?1] 進行狀態轉移
class Solution {
public:int removeAlmostEqualCharacters(string word) {int n = word.size();int p[n][26];for (int j = 0; j < 26; j++)p[0][j] = 1;p[0][word[0] - 'a'] = 0;for (int i = 1; i < n; i++)for (int j = 0; j < 26; j++) {p[i][j] = INT32_MAX;for (int pre = 0; pre < 26; pre++)if (abs(j - pre) > 1)p[i][j] = min(p[i][j], p[i - 1][pre] + (word[i] - 'a' == j ? 0 : 1));}int res = INT32_MAX;for (int j = 0; j < 26; j++)res = min(res, p[n - 1][j]);return res;}
};
C 最多 K 個重復元素的最長子數組
滑動窗口+哈希:哈希表記錄滑動窗口內數的頻率,枚舉滑動窗口的左邊界,盡可能移動滑動窗口的右邊界
class Solution {
public:int maxSubarrayLength(vector<int> &nums, int k) {int n = nums.size();int res = 0;unordered_map<int, int> f;for (int l = 0, r = -1; l < n; f[nums[l++]]--) {while (r + 1 < n && f[nums[r + 1]] + 1 <= k)//滑窗左邊界固定時,盡可能移動右邊界f[nums[++r]]++;res = max(res, r - l + 1);}return res;}
};
D 關閉分部的可行集合數目
枚舉:枚舉可能的關閉分部集合,然后在當前關閉情況下跑多源最短路算法,然后判斷最大的最短路是否不超過 m a x D i s t a n c e maxDistance maxDistance
class Solution {
public:inline int get_bit(int mask, int loc) { return mask >> loc & 1; }//返回mask二進制表示的第loc位int pop_cnt(int mask) {//返回mask二進制表示中1的個數int res = 0;for (; mask; mask >>= 1)if (mask & 1)res++;return res;}int numberOfSets(int n, int maxDistance, vector<vector<int>> &roads) {int inf = INT32_MAX;vector<vector<int>> g(n, vector<int>(n, inf));for (auto &e: roads) {g[e[0]][e[1]] = min(g[e[0]][e[1]], e[2]);g[e[1]][e[0]] = g[e[0]][e[1]];}int res = 0;for (int mask = 0; mask < (1 << n); mask++) {//枚舉關閉分部集合:mask二進制中第i位為0表示第i個分部關閉auto t = g;for (int k = 0; k < n; k++)if (get_bit(mask, k))for (int i = 0; i < n; i++)if (get_bit(mask, i))for (int j = 0; j < n; j++)if (get_bit(mask, j))if (t[i][k] != inf && t[k][j] != inf)t[i][j] = min(t[i][j], t[i][k] + t[k][j]);int mx = 0;//最大的最短路for (int i = 0; i < n; i++)if (get_bit(mask, i))for (int j = 0; j < n; j++)if (j != i && get_bit(mask, j))mx = max(mx, t[i][j]);if (mx <= maxDistance)res++;}return res;}
};