[再帰、検索、バックトラッキングアルゴリズムの演習] 2日目


1. 24. リンクリスト内のノードのペアごとの交換

1. トピックの紹介

24. リンク リスト内のノードをペアごとに交換する
リンク リストが与えられ、リンク リスト内の隣接するノードをペアごとに交換し、交換されたリンク リストのヘッド ノードを返します。ノード内の値を変更せずにこの質問に回答する必要があります (つまり、ノードのスワップのみを実行できます)。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

2. 問題解決のアイデア

再帰的なアイデア:
最初に 2 番目のノード以降のノードを処理し、次に最初の 2 つのノードを交換し、最後に後で処理されたノードを接続します。

反復のアイデア:
ダブルポインター メソッド (スリー ポインター メソッド)
2 つのポインターが交換され、リンク リストが走査されるまで 3 番目のポインターが走査されます。

3.コード

再帰:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */

class Solution {
    
    
public:
    ListNode* swapPairs(ListNode* head) {
    
    
        if(head == nullptr || head -> next == nullptr) return head;
        ListNode* t = head -> next -> next;
        ListNode* next = head -> next;
        next -> next = head;
        head -> next = swapPairs(t);
        return next;
    }
};

反復:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */

class Solution {
    
    
public:
    ListNode* swapPairs(ListNode* head) {
    
    
        if(head == nullptr || head -> next == nullptr) return head;
        ListNode* prev = head,* cur = head -> next,* next = cur -> next;
        ListNode* newhead = cur;
        int flag = 1;//假设链表的节点个数为偶数
        while(next)
        {
    
    
            cur -> next = prev;
            if(next -> next)//链表的节点个数是偶数个或者未到达链表结尾
            {
    
    
                prev -> next = next -> next;
                cur = next -> next;
                prev = next;
                next = cur -> next;
            }
            else//如果链表的结点个数是奇数个
            {
    
    
                flag = 0;
                prev -> next = next;
                next = next -> next;
            }
        }
        if(flag)
        {
    
    
            cur -> next = prev;
            prev -> next = next;
        }
        return newhead;
    }
};

4. 走行結果

再帰:
ここに画像の説明を挿入します
反復:
ここに画像の説明を挿入します

2. 50. Pow(x, n)

1. トピックの紹介

50. パウ(x, n)
ここに画像の説明を挿入します
ここに画像の説明を挿入します

2. 問題解決のアイデア


アイデア: Long Long のn / 2 倍を計算します。

3.コード

class Solution {
    
    
public:
    double myPow(double x, int n) {
    
    
        return n < 0 ? 1 / func(x, -(long long)n) : func(x, n);
    }

    double func(double x, long long n)
    {
    
    
        if(n == 0) return 1.0;
        double t = myPow(x, n / 2);
        double ret = t * t;
        if(n % 2) ret *= x;
        return ret;
    }
};

4. 走行結果

ここに画像の説明を挿入します

3. 2331. ブール二分木の値を計算する

1. トピックの紹介

2331. ブール二分木の値の計算
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

2. 問題解決のアイデア

最初に子ノードを計算し、次に子ノードのブール値とそれ自体が表す演算子に基づいて独自のブール値を計算します。

3.コード

/**
 * 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:
    bool evaluateTree(TreeNode* root) {
    
    
        if(root -> val == 0)    return false;
        if(root -> val == 1)    return true;
        if(root -> val == 2)    return evaluateTree(root -> left) || evaluateTree(root -> right);
        return evaluateTree(root -> left) && evaluateTree(root -> right);
    }
};

4. 走行結果

ここに画像の説明を挿入します


要約する

今日は再帰、検索、およびバックトラッキング アルゴリズムの演習の 2 日目です。
継続は勝利です。頑張ってください。
この記事があなたにインスピレーションを与えたなら、著者をもっとサポートしていただければ幸いです。皆さん、ありがとう!

おすすめ

転載: blog.csdn.net/xjjxjy_2021/article/details/132032713