LeetCode 165レースコース週
Cは暴力だけで十分なデータを言うことができません
4の勝者を見つけるために三目並べ
タイトル説明説明
AとBは、3×3のグリッドに三目並べをプレイ。
次のように三目並べゲームのルールは以下のとおりです。
玩家轮流将棋子放在空方格 (" ") 上。
第一个玩家 A 总是用 "X" 作为棋子,而第二个玩家 B 总是用 "O" 作为棋子。
"X" 和 "O" 只能放在空方格中,而不能放在已经被占用的方格上。
只要有 3 个相同的(非空)棋子排成一条直线(行、列、对角线)时,游戏结束。
如果所有方块都放满棋子(不为空),游戏也会结束。
游戏结束后,棋子无法再进行任何移动。
あなたの各要素は、サイズ2の別のアレイであるアレイ(グリッドの行と列に対応する要素)を得るに移動、それが記録された2のそれぞれの行動(第A b)の後、AとBの順でありますポーン位置。
ゲームの勝者(AまたはB)がある場合は、ゲームの勝者に戻り、引き分けで試合が終了した場合は、「ドロー」を返され、アクション(ゲームの終わりではないが)まだある場合は、「保留」を返されます。
あなたが移動する(三目並べのルールに従う)が有効であると仮定することができ、メッシュは最初は空で、Aは、最初に行動します。
サンプル入力と出力のサンプルサンプル入力と出力例
例1:
输入:moves = [[0,0],[2,0],[1,1],[2,1],[2,2]]
输出:"A"
解释:"A" 获胜,他总是先走。
"X " "X " "X " "X " "X "
" " -> " " -> " X " -> " X " -> " X "
" " "O " "O " "OO " "OOX"
例2:
输入:moves = [[0,0],[1,1],[0,1],[0,2],[1,0],[2,0]]
输出:"B"
解释:"B" 获胜。
"X " "X " "XX " "XXO" "XXO" "XXO"
" " -> " O " -> " O " -> " O " -> "XO " -> "XO "
" " " " " " " " " " "O "
例3:
入力:移動= [0,0]、 [1,1]、[2,0]、[1,0]、[1,2]、[2,1]、[0,1]、[0、 2]、[2,2]]
出力:「ドロー」
の出力を:再アクションに方法がないので、ゲームは引き分けに終わりました。
"XXO"
"OOX"
"XOX"
例4:
入力:移動= [[0,0]、 [1,1]]
出力: "保留"
説明:ゲームオーバーではありません。
"X-"
"O"
""
ヒントヒント
ヒント:
1 <= moves.length <= 9
moves[i].length == 2
0 <= moves[i][j] <= 2
moves 里没有重复的元素。
moves 遵循井字棋的规则。
問題の解決策
シミュレーションは、3×3ビットコンピューティングの練習を見ている考慮に入れてすることができます
コード
class Solution {
public:
int run(int g[3][3], vector<int>&move, int val) {
g[move[0]][move[1]] = val;
int t = 0, ans = 0;
for(int i = move[0]; i < 3; ++i) {
if(g[i][move[1]] == val)
t++;
else
break;
}
for(int i = move[0] - 1; i >= 0; --i) {
if(g[i][move[1]] == val)
t++;
else
break;
}
ans = max(ans, t);
t = 0;
for(int i = move[1]; i < 3; ++i) {
if(g[move[0]][i] == val)
t++;
else
break;
}
for(int i = move[1] - 1; i >= 0; --i) {
if(g[move[0]][i] == val)
t++;
else
break;
}
ans = max(ans, t);
t = 0;
for(int i = 0; i + move[0] < 3 && i + move[1] < 3; ++i) {
if(g[i + move[0]][i + move[1]] == val)
t++;
else
break;
}
for(int i = -1; i + move[0] >= 0 && i + move[1] >= 0; --i) {
if(g[i + move[0]][i + move[1]] == val)
t++;
else
break;
}
ans = max(ans, t);
t = 0;
for(int i = 0; i + move[0] < 3 && move[1] - i >= 0; ++i) {
if(g[i + move[0]][-i + move[1]] == val)
t++;
else
break;
}
for(int i = -1; i + move[0] >= 0 && move[1] - i < 3 ; --i) {
if(g[i + move[0]][-i + move[1]] == val)
t++;
else
break;
}
ans = max(ans, t);
t = 0;
return ans;
}
bool finished(int g[3][3]) {
for(int i = 0; i < 3; ++i)
for(int j = 0; j < 3; ++j)
if(g[i][j] == 0)
return false;
return true;
}
string tictactoe(vector<vector<int>>& moves) {
int g[3][3];
memset(g, 0, sizeof(g));
for(int i = 0, n = moves.size(); i < n; ++i) {
if(run(g, moves[i], i % 2 + 1) > 2)
return (i & 1) ? string("B") : string("A");
}
return finished(g) ? string("Draw") : string("Pending");
}
};
生ハンバーグの生産プログラムを無駄にしないでください4
タイトル説明説明
クリスマスのウォームアップ活動が権利を始めた、私たちは、新しいバーガーバーガーセットを導入しました。材料を無駄にしないようにするには、それらを適切な生産計画を策定するのに役立ちます。
そして、次の2つの整数のtomatoSlicesのcheeseSlicesを与えるトマトとチーズのピースの数を表します。異なる材料でハンバーグ次のように:
巨无霸汉堡:4 片番茄和 1 片奶酪
小皇堡:2 片番茄和 1 片奶酪
[total_jumbo、total_small]([ビッグマックハンバーガー合計、小とてつもない大ぼらの合計数])に、あなたは、スライスチーズスライスcheeseSlices tomatoSlicesトマト残りが0であるように、フォーマット生成プログラムの適切な数を返します。
あなたはチーズスライスの残りの部分を作ることができない場合は、トマトのスライスtomatoSlices cheeseSlices数が0である場合、[]に戻ります。
サンプル入力と出力のサンプルサンプル入力と出力例
例1:
入力:tomatoSlices = 16、cheeseSlices = 7
出力:[1,6]
説明:ビッグマックと小さなとてつもない大ぼら6を作製する4必要1 + 2 6 = 16 + 6 = 1トマト、チーズ7。残りの材料はしません。
例2:
入力:tomatoSlices = 17、cheeseSlices = 4
出力:[]
説明:ちょうどフォートリトル女王とビッグマックは、すべての原材料が不足することはできませんします。
例3:
入力:tomatoSlices = 4、cheeseSlices = 17
出力:[]
説明:ビッグ・マックチーズ16を作るが残されるが、二つの小さな残りの15とてつもない大ぼらチーズを生成します。
例4:
入力:tomatoSlices = 0、cheeseSlices = 0
出力:[0,0]
例5:
入力:tomatoSlices = 2、cheeseSlices = 1つの
出力:[0,1]
ヒントヒント
ヒント:
0 <= tomatoSlices <= 10^7
0 <= cheeseSlices <= 10^7
問題の解決策
、第1の小帝国の砦として、すべての小さな砦ウォンビッグマックのハンバーガーに残り2個のトマトのそれぞれを考えてみましょう。ボーダーと宣告に特別な注意。
コード
class Solution {
public:
vector<int> numOfBurgers(int tomatoSlices, int cheeseSlices) {
if(tomatoSlices > cheeseSlices * 4)
return vector<int> {};
vector<int> ans(2);
ans[1] = cheeseSlices;
tomatoSlices -= 2 * cheeseSlices;
if(tomatoSlices < 0 || (tomatoSlices & 1))
return vector<int> {};
ans[1] -= tomatoSlices / 2;
ans[0] += tomatoSlices / 2;
tomatoSlices -= tomatoSlices - (tomatoSlices & 1);
if(tomatoSlices != 0)
return vector<int> {};
return ans;
}
};
統計は、すべての正方サブ行列1~5であります
タイトル説明説明
あなたがm * n列の行列、0または1のいずれかの行列要素を与え、あなたは正方形のサブマトリクス1の数を数えるところへの復帰は、完全に構成されています。
サンプル入力と出力のサンプルサンプル入力と出力例
例1:
入力:マトリックス=
[
[0,1,1,1]、
[1,1,1,1]、
[0,1,1,1]
]
出力:15
説明:
10と1平方。
2の正方形は4を持っています。
3の正方形があります。
正方形= 10 + 4 + 1 = 15の数。
例2:
入力:マトリックス=
[
[1,0,1]、
[1,1,0]、
[1,1,0]
]
出力:7
説明:
6のいずれかの二乗。
そこに2の四角形。
四角= 6 + 1 = 7の数。
ヒントヒント
1 <= arr.length <= 300
1 <= ARR [0] .LENGTH <= 300
0 <= ARR [I] [J] <= 1
問題の解決策
暴力は、明らかに強い十分なデータを持っていたことができます。
コード
class Solution {
public:
int n, m;
int countSquares(vector<vector<int>>& matrix) {
n = matrix.size(), m = matrix[0].size();
int ans(0);
for(int i = 1, c; i <= min(n, m); ++i) {
c = count(matrix, i);
ans += c;
if(!c)
break;
}
return ans;
}
int count(vector<vector<int> >&matrix, int edgeLen) {
int ans(0);
for(int i = 0; i < n - edgeLen + 1; ++i) {
for(int j = 0; j < m - edgeLen + 1; ++j)
if(isSquareAllOne(matrix, i, j, edgeLen))
ans++;
}
return ans;
}
bool isSquareAllOne(vector<vector<int>>&matrix, int x, int y, int edgeLen) {
for(int i = 0; i < edgeLen; ++i) {
for(int j = 0; j < edgeLen; ++j)
if(!matrix[x + i][y + j])
return false;
}
return true;
}
};
回文配列IIIを割ます
タイトル説明説明
あなたは、小文字の文字列sと、整数kを与えます。
次の要件に応じて文字列を分割してください:
首先,你可以将 s 中的部分字符修改为其他的小写英文字母。
接着,你需要把 s 分割成 k 个非空且不相交的子串,并且每个子串都是回文串。
文字列の部門内の文字の最小数を変更することが必要なこの方法を返却してください。
サンプル入力と出力のサンプルサンプル入力と出力例
例1:
入力:S =「ABC」、K = 2
出力:1
説明:あなたは、文字列「AB」と「C」に分割され、それが回文になった文字列に「AB」を変更することができます。
例2:
入力:S = "aabbc"、K = 3
出力:0
説明:あなたが回文配列されている"AA"、 "BB"と"C"、に文字列を分割することができます。
例3:
入力:S = "leetcode"、K = 8
出力:0
ヒントヒント
1 <= k <= s.length <= 100
s 中只含有小写英文字母。
問題の解決策
DP [I] [J]修飾セグメントの最小数に終わるI、Jを表します。前の場所に終了列挙期間、dp[i][j] = min(dp[i][j],dp[pre][j-1])
コード
class Solution {
public:
int palindromePartition(string s, int k) {
int dp[s.length()][k + 1];
memset(dp, 0x3f, sizeof(dp));
for(int i = 0; i < s.length(); ++i) { // end with s[i]
for(int j = 1; j <= k && j <= i + 1; ++j) { // has j segments
if(j == 1)
dp[i][j] = transferCost(s, 0, i);
else
for(int pre = max(j - 2, 0); pre < i; ++pre) {
dp[i][j] = min(dp[i][j], dp[pre][j - 1] + transferCost(s, pre + 1, i));
}
}
}
return dp[s.length() - 1][k];
}
int transferCost(string s, int l, int r) {
int ans(0);
for(int i = 0; i < (r - l + 1) / 2; ++i)
if(s[i + l] != s[r - i])
ans++;
return ans;
}
};