Leetcode Weekly Contest 198 翻车实录

Leetcode Weekly Contest 198 翻车实录_第1张图片

小学数学

class Solution {
public:
    int numWaterBottles(int a, int b) {
        int rem = a;
        int cnt = a;
        while(a/b){
            int temp = a/b;
            cnt += a/b;
            a %= b;
            a += temp;
        }
        return cnt;
    }
};

Leetcode Weekly Contest 198 翻车实录_第2张图片

建树加dfs,开数组存结果 O(26n)

class Solution {
public:
    vector countSubTrees(int n, vector>& edges, string labels) {
        vector> cnt(n+5, vector(26, 0));
        vector> g(n, vector());
        for(auto e:edges){
            g[e[0]].push_back(e[1]);
            g[e[1]].push_back(e[0]);
        }
        dfs(cnt, g, 0, -1, labels);
        vector ans(n);
        for(int i=0; i>& cnt, vector>& g, int id, int fa, string& labels){
        cnt[id][labels[id]-'a']++;
        for(int i:g[id]){
            if(i==fa)
                continue;
            dfs(cnt, g, i, id, labels);
            for(int j=0; j<26; j++)
                cnt[id][j] += cnt[i][j];
        }
    }
};

Leetcode Weekly Contest 198 翻车实录_第3张图片

可以发现这样一个规律,根据&操作的特性,
&的长度越长,结果不会变的更大,所以可以
求前缀和之后二分答案的使用的长度或者双指针

class Solution {
public:
    int closestToTarget(vector& arr, int target) {
        vector> cnt(arr.size()+1,vector(20, 0));
        for(int i=0; i

你可能感兴趣的:(Leetcode Weekly Contest 198 翻车实录)