Leetcode 164レースウィーク

最小時間のすべてのポイントへのアクセス

思考

各モバイル・グリッドは、水平方向、垂直方向移動格子と格子の対角線方向、及び水平グリッド有するので\(+ \)垂直方向のグリッド\(= \)対角線方向グリッド、最終的な答えは、シッフ距離との比の隣接点を切断します。

コード

class Solution {
public:
    int minTimeToVisitAllPoints(vector<vector<int>>& points) {
        int n = points.size(), ans = 0;
        for(int i = 1; i < n; ++i) {
            int disx = abs(points[i][0]-points[i-1][0]), disy = abs(points[i][1]-points[i-1][1]);
            ans += max(disx, disy);
        }
        return ans;
    }
};

統計的には、サーバ通信に参加します

思考

その後、各列の各行の統計少数のサーバ、および各列の仲間を見たり、サーバの同じ数がサーバーよりも大きい\(1 \)

コード

class Solution {
public:
    int countServers(vector<vector<int>>& grid) {
        int n = grid.size(), m = grid[0].size();
        int row[255], col[255];
        for(int i = 0; i < n; ++i) row[i] = 0;
        for(int i = 0; i < m; ++i) col[i] = 0;
        for(int i = 0; i < n; ++i) {
            for(int j = 0; j < m; ++j) {
                if(grid[i][j]) ++row[i], ++col[j];
            }
        }
        int ans = 0;
        for(int i = 0; i < n; ++i) {
            for(int j = 0; j < m; ++j) {
                if((row[i] > 1 || col[j] > 1) && grid[i][j]) ++ans;
            }
        }
        return ans;
    }
};

検索推薦システム

思考

私たちは辞書式順序で最初のソート文字列、文字列の長さは1つのエンドポイントは、現在の位置に文字や長さや横断したよりも小さい場合に、ポインタの2組と一緒に移動\(SearchWord \)の中でこの位置に文字はしばらくポインタを移動しません。

コード

class Solution {
public:
    vector<vector<string>> suggestedProducts(vector<string>& products, string searchWord) {
        int n = products.size(), l = 0, r = n - 1;
        sort(products.begin(), products.end());
        int len = searchWord.length();
        vector<vector<string>> ans(len);
        for(int i = 0; i < len; ++i) {
            while(l <= r && (products[l].length() <= i || products[l][i] != searchWord[i])) ++l;
            while(r >= l && (products[r].length() <= i || products[r][i] != searchWord[i])) --r;
            if(l > r) continue;
            for(int j = l; j <= min(l + 2, r); ++j) {
                ans[i].push_back(products[j]);
            }
        }
        return ans;
    }
};

場所にプログラムの数を停止します

思考

我々は定義(DP [I] [j]が\)\第表す\(I \)ステップ(J \)\この位置におけるプログラムの数を、伝達方程式を見つけることは容易であるDP [I] [J(\ ] DP = [1-I] [J-1] + DP [1-I] [J] + DP [1-I]は[J + 1] \)、我々は、各状態及び一つだけの状態に関連する注意しますしたがって、回転式配列でスペースを最適化することができます。

しかし、この複雑さはある(Oは(ステップ* arrLen)\)\我々が上に移動することができたときに、私たちが見ることができます\(分(arrLen、ステップ) \) ので、この位置で、そのため、この値は考慮しなかったであろうよりも大きく配置します複雑になり(O(分*ステップ(階段、arrLen))\)\

 コード

class Solution {
public:
    const int mod = 1e9 + 7;
    int dp[2][1000005];

    int add(int x, int y) {
        x += y;
        if(x >= mod) x -= mod;
        return x;
    }

    int numWays(int steps, int arrLen) {
        arrLen = min(arrLen, steps);
        for(int i = 0; i < arrLen; ++i) dp[0][i] = dp[1][i] = 0;
        dp[0][0] = 1;
        for(int i = 1; i <= steps; ++i) {
            int nw = i % 2, pre = (i - 1) % 2;
            for(int j = 0; j < arrLen; ++j) {
                dp[nw][j] = dp[pre][j];
                if(j > 0) dp[nw][j] = add(dp[nw][j], dp[pre][j-1]);
                if(j + 1 < arrLen) dp[nw][j] = add(dp[nw][j], dp[pre][j+1]);
            }
        }
        return dp[steps%2][0];
    }
};

おすすめ

転載: www.cnblogs.com/Dillonh/p/11950507.html