32.最長有効括弧
ハード
ただ文字を含む文字列を考える '('
と ')'
、(整形式の)部分文字列を有効括弧最長の長さを見つけます。
例1:
入力:「(()」
出力:2
説明:最長有効な括弧の部分文字列であります"()"
例2:
入力:「)()())
」 出力:4 説明:最長有効な括弧の部分文字列であります"()()"
容認されました
200042
提出
774584
する#include <stdio.hに> する#include <iostreamの> する#include <ベクトル> の#include <アルゴリズム> の#include <スタック> の#include < ストリング > の#include <メモリ> の#include <memory.h> の#include <hash_map> #含める <マップ> 書式#include < 設定 > 書式#include <unordered_map> 使用して 名前空間はstdを、 クラスのソリューション{ パブリック: int型 longestValidParentheses(文字列S){ スタック <> Q; INT =開始0 ; int型 ANS = 0 ; 以下のために(int型 i = 0 ; i)は(s.lengthを<; iは++ ) { もし、(S [I] == ' (' ) q.push(I); 他 { 場合(q.empty()) 開始 = I + 1 ; 他 { int型の TEMP = q.top(); q.pop(); // +1は、(最初に追加することです ANS = MAX(?ANS、q.empty()は、i-スタート+ 1:I- q.top()); } } } 戻りANS。 } }。 INT メイン() { 文字列のRES = { " (())" }。 溶液S; int型のn; N = s.longestValidParentheses(RES)。 COUT << N << ENDL。 リターン 0 ; }
回転したソート配列で33件の検索
中
昇順にソート配列は、事前にあなたにいくつかのピボット不明で回転させるとします。
(すなわち、 [0,1,2,4,5,6,7]
なるかもしれません [4,5,6,7,0,1,2]
)。
あなたが検索した目標値を与えています。配列で見つかった場合は、そのインデックスを返し、そうでない場合は返します -1
。
あなたは重複が配列に存在しないと仮定して。
あなたのアルゴリズムの実行時の複雑さは、の順番でなければなりません O(ログ nで)。
例1:
入力:NUMS = [ 4,5,6,7,0,1,2]
、ターゲット= 0
出力:4
例2:
入力:NUMSは= [4,5,6,7,0,1,2]
、ターゲット= 3 出力:-1
注目点:
明確にしてください>> =かどうか、多くの状況で大幅に差が発生する可能性があります=追加
<= R、ない=、たくさんの原因になりますあなたはリットルを書き込まない場合は、このコードでは問題の
する#include <stdio.hに> する#include <iostreamの> する#include <ベクトル> の#include <アルゴリズム> の#include <スタック> の#include < ストリング > の#include <メモリ> の#include <memory.h> の#include <hash_map> #含める <マップ> 書式#include < 設定 > 書式#include <unordered_map> 使用して 名前空間はstdを、 クラスのソリューション{ パブリック: int型の検索(ベクトル< int型 >&NUMS、L = 0、R = nums.size() - 1 ; 一方、(L <= R) { int型ミッド=(L + R)/ 2 。 もし(NUMS [中期] ==ターゲット)リターン中旬。 もし(NUMS [中間] < NUMS [R]) { 場合(目標> NUMS [中間] &&ターゲット<= NUMS [R]) 、L =ミッド+ 1 。 他に 、R =半ば1 。 } 他 { 場合(目標> = NUMS [L] &&ターゲット< NUMS [中間]) { R =半ば1 。 } 他 { L =ミッド+ 1 。 } } } リターン - 1 。 } }。 INT メイン() { ベクトル < INT > NUMS = { 4、5、6、7、0、1、2 }。 int型のターゲット= 0、RES =0 ; 溶液S; RES = s.search(NUMS、ターゲット) coutの << RES << てendl; リターン 0 ; }
38カウントとセイ
イージー
カウントと、言うのシーケンスは、次のように最初の5つの用語を整数の配列です。
1 1 2 11 3 21 4 1211 5 111221
1
読みとります "one 1"
か 11
。11
読みとります "two 1s"
か 21
。21
読み取るされ "one 2
、その後、 one 1"
または 1211
。
整数所与 nは 1≤ N ≦30、生成する Nカウント・アンド・言う配列の用語番目。
注意:整数のシーケンスの各用語は、文字列として表現されます。
例1:
入力:1つの 出力: "1"
例2:
入力:4 出力: "1211"
注意:
1.forループ注目開始および終了;(; I </ <= n iは++ i = 0/1)のため
2.stringは、文字列その背後に追加し、そのような文字列+ = Aのように、解決するための特別な作用を有します。
前にマイナス「0」に必要なので、3.string番号「3」と実数3の距離は、「0」である
ことが計算に追加します。
する#include <stdio.hに> する#include <iostreamの> する#include <ベクトル> の#include <アルゴリズム> の#include <スタック> の#include < ストリング > の#include <メモリ> の#include <memory.h> の#include <hash_map> #含める <マップ> 書式#include < 設定 > 書式#include <unordered_map> 使用して 名前空間はstdを、 クラスのソリューション{ パブリック: " ; のため(int型 i = 1 ; iがN <Iは、++は) { ANS = 言う(ANS); } 戻り、ANS } プライベート: 文字列は言う(CONST 文字列&N) { 文字列ANS; int型、S = 0、L = Nを; .LENGTH() のための(INT E = 1 ; E <= 1 E ++ ) { 場合(!E == L || N [S] = N [E]) { int型= E-カウント秒; ANS + = ' 0 ' + 数えます。 ANS + = N [S]。 S = E; } } 戻りANS。 } }。 INT メイン() { 文字列RES。 溶液S; INT、N = 4 。 RES = s.countAndSay(N)。 coutの << RES << てendl; リターン 0 ; }