先试用哈希表来记录一下各个数组的值,在进行查询
class Solution: def findIntersectionValues(self, nums1: List[int], nums2: List[int]) -> List[int]: st1 = set(nums1) st2 = set(nums2) return [sum(x in st2 for x in nums1), sum(x in st1 for x in nums2)]
贪心
class Solution: def removeAlmostEqualCharacters(self, word: str) -> int: res = 0 n = len(word) i = 1 while i < n: if abs(ord(word[i - 1]) - ord(word[i])) <= 1: res += 1 i += 2 else: i += 1 return res
滑动窗口经典题,以前没做过,在周赛上面吃亏了。
class Solution: def maxSubarrayLength(self, nums: List[int], k: int) -> int: n = len(nums) left = 0 cnt = Counter() res = 0 for right, x in enumerate(nums): cnt[x] += 1 while cnt[x] > k: cnt[nums[left]] -= 1 left += 1 res = max(res, right - left + 1) return res
利用二进制来枚举集合。
class Solution { public: int d[10][10]; int numberOfSets(int n, int maxDistance, vector<vector<int>>& roads) { int res = 0; for(int s = 0; s < (1 << n); s ++ ) { memset(d, 0x3f, sizeof d); for(int j = 0; j < n; j ++ ) d[j][j] = 0; for(auto &it: roads) { int a = it[0], b = it[1], c = it[2]; if((s >> a & 1) && (s >> b & 1)) { d[a][b] = d[b][a] = min(d[a][b], c); } } for(int k = 0; k < n; k ++ ) { for(int i = 0; i < n; i ++ ) { for(int j = 0; j < n; j ++ ) { d[i][j] = min(d[i][j], d[i][k] + d[k][j]); } } } bool flag = 1; for(int i = 0; i < n; i ++ ) { for(int j = 0; j < n; j ++ ) { if((s >> i & 1) && (s >> j & 1)) { if(d[i][j] > maxDistance) { flag = false; break; } } } } if(flag) res ++ ; } return res; } };