【リートコード】HOT 100(22)

質問リストの紹介:

LeetCode で最も人気のある 100 の質問を厳選しました。アルゴリズムやデータ構造に慣れていない初心者や、短期間で効率的に上達したい人に適しています。この 100 の質問をマスターすれば、コードで学習する能力がすでに備わっています。世界を通り抜ける能力。

目次

質問リストの紹介:

トピック: 538. 二分探索木を累積木に変換する - Leetcode

トピックのインターフェース:

問題解決のアイデア:

コード:

終わった、終わった!

タイトル: 494. 目標と - Leetcode

トピックのインターフェース:

問題解決のアイデア:

コード:

終わった、終わった!

最後に次のように書きます。


トピック: 538. 二分探索木を累積木に変換する - Leetcode

トピックのインターフェース:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int sum = 0;
    TreeNode* convertBST(TreeNode* root) {

    }
};

問題解決のアイデア:

この質問は難しいものではありませんが、

一番難しいのはタイトルの意味が分からないことですが、理解できれば簡単です。

実際、この質問にはいくつかの重要なポイントしかありません。

それらを列挙します。

1. これは二分探索木です

2. 累積ツリーの性質: 各ノードの値 = そのノードより大きいすべてのノードの値 + 自分自身の値

実際、これら 2 つのプロパティは、

そして、この二分探索木を累積木に変換してみようというのがタイトルです。

したがって、二分探索木の性質に従って最大のノードから検索を開始するだけで済みます。

次に、値を順番に合計します。

コードは以下のように表示されます:

コード:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int sum = 0;
    TreeNode* convertBST(TreeNode* root) {
        if(root == nullptr) return nullptr;
        convertBST(root->right);
        sum += root->val;
        root->val = sum;
        convertBST(root->left);
        return root;
    }
};

終わった、終わった!

タイトル: 494. 目標と - Leetcode

トピックのインターフェース:

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {

    }
};

問題解決のアイデア:

この問題も動的計画法です。

当初は暴力的な列挙を使用したかったが失敗し、困難になる例がある

また動的プログラミングかよ、くそー、

2週間後には夏休みがあり、時間はあるので、

すぐに動的プログラミングの質問に行き、落ち込んでください。

今は検索を使って書くだけです。

検索ロジックは比較的単純なので、ここでは説明しません。

予期せぬことに、私のコードは 1,000 ミリ秒以上実行され、戻ってきました。

コードは以下のように表示されます:

コード:

class Solution {
public:
    int ans = 0;
    int findTargetSumWays(vector<int>& nums, int target) {
        dfs(nums, target, 0, 0);
        return ans;
    }
private:   
    void dfs(const vector<int>& nums, int target, int start, int sum) {
        if(sum == target && start == nums.size()) {
            ans++;
            return;
        }

        if(start >= nums.size()) return;

        dfs(nums, target, start + 1, sum + nums[start]);
        dfs(nums, target, start + 1, sum - nums[start]);
    }
};

終わった、終わった!

最後に次のように書きます。

以上が今回の記事の内容となります、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/131338413