記事ディレクトリ
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. トピックの紹介
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. トピックの紹介
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 日目です。
継続は勝利です。頑張ってください。
この記事があなたにインスピレーションを与えたなら、著者をもっとサポートしていただければ幸いです。皆さん、ありがとう!