C++のレースカー
位置0から始まり、無限の数直線上で速度+1の車があるとします。車は一連の指示に従って自動的に走行します。A:加速の場合、R-は後進の場合。 「A」の指示を受けると、私たちの車は次のことを行います-
- 位置:=位置+速度、次に速度=速度*2。
「R」の指示を受けると、私たちの車は次のことを行います-
- 速度が正の場合、速度=-1、
- それ以外の場合、速度=1。
たとえば、「AAR」の命令を実行した後、車は0-> 1-> 3-> 3の位置に移動し、速度は1->2->4->-1に移動します。
ここで、ターゲット位置があるとします。そこに到達するには、命令の最短シーケンスの長さを見つける必要があります。
したがって、入力がtarget =6のような場合、可能なシーケンスの1つがAAARAであるため、出力は5になり、位置シーケンスは0-> 1-> 3-> 7-> 7-> 6
>これを解決するには、次の手順に従います-
- 訪問した1セットを定義する
- 1つのキューを定義するq
- {0、1}をqに挿入
- 初期化レベル:=0の場合、qが空でない場合は、更新(レベルを1増やします)、実行-
- kの初期化:=qのサイズ、k> 0の場合、更新(kを1つ減らす)、実行-
- 1ペアのcurrを定義します:=qの前の要素、qから要素を削除します
- 最初のcurrがターゲットと同じである場合、-
- リターンレベル
- forward:=currの最初+currの2番目
- forwardSpeed:=currの2番目*2
- key:=forward to string concatenate "*" concatenate convert forwardSpeed to string
- 転送>0および|転送-ターゲット|の場合<キーではなくターゲットが訪問されていない場合、-
- 訪問先にキーを挿入
- {forward、forwardSpeed}をqに挿入します
- key:=currの最初の文字列を文字列に変換しますconcatenate"*"currの2番目が0より大きい場合は0を連結します。それ以外の場合は-1
- curr.first>0および|target--curr.first|の場合<ターゲットとキーが訪問されていない場合、-
- 訪問先にキーを挿入
- {curr.first、(curr.second> 0の場合は-1、それ以外の場合は1})をqに挿入します
- kの初期化:=qのサイズ、k> 0の場合、更新(kを1つ減らす)、実行-
- 戻り値-1
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int racecar(int target) {
unordered_set < string > visited;
queue < pair <int ,int> > q;
q. push({0, 1});
for(int level = 0; !q.empty(); level++){
for(int k = q.size(); k > 0; k-- ){
pair <int, int> curr = q.front();
q.pop();
if(curr.first == target) return level;
int forward = curr.first + curr.second;
int forwardSpeed = curr.second * 2;
string key = to_string(forward) + "*" + to_string(forwardSpeed);
if(forward > 0 && abs(forward - target) < target && !visited.count(key)){
visited.insert(key);
q.push({forward, forwardSpeed});
}
key = to_string(curr.first) + "*" + to_string(curr.second > 0 ? - 1: 1);
if(curr.first > 0 && abs(target - curr.first) < target && !visited.count(key)){
visited.insert(key);
q.push({curr.first, curr.second > 0 ? - 1: 1});
}
}
}
return -1;
}
};
main(){
Solution ob;
cout << (ob.racecar(6));
} 入力
6
出力
5
-
C++で通過する車のペアを数える
0と1のみを含む長さNの配列が与えられます。値1は西方向に向かう車を表し、値0は東方向に向かう車を表します。 車Aと車Bのペアが0<=A
-
C++で最大のBSTサブツリー
二分木があるとしましょう。その中で最大のサブツリーを見つける必要があります。ここで、最大とは、ノードの数が最も多いサブツリーを意味します。 したがって、入力が次のような場合、 この場合、最大のBSTサブツリーが強調表示されているため、出力は3になります。 これを解決するには、次の手順に従います- データと呼ばれる1つの構造を定義します。サイズ、maxVal、minVal、okの4つの値があり、okはtrue/falseの値のみを保持できます 解決(TreeNode *ノード) ノードがnullの場合、&miuns; 初期化してデータを返す(0、無限大、-無