第 119 场双周赛(滑动窗口,二进制集合枚举,Floyd算法应用)

发布时间 2023-12-10 22:45:56作者: 深渊之巅

 先试用哈希表来记录一下各个数组的值,在进行查询

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;
    }
};