1. N皇后(Hard)
nは研究クイーン問題はどのようにあるn個置かクイーンズのn × nはボード上の、そして女王はお互いにお互いを攻撃することはできません。
画像ショー8つのクイーンの問題を解決するためのAの方法。
整数所与N、すべての異なる返し、n個の女王の問題に対する解決策を。
各溶液は、明示的な含有Nクイーン問題片は、プログラムの実施例を配置'Q'
し、'.'
スペース、クイーンを表します。
例:
1 |
入力:4 |
回答:
アイデア:バックトラック
この質問は困難であり、新入生はとても難しいと感じました。。。
アルゴリズムの設立に先立ち、私たちは2つの有用な詳細を検討してみましょう。
ラインだけの女王を持ってもよく、1つだけの女王を有することができます。
これは、ボード上の正方形のすべてを考慮する必要がないことを意味します。単純に列を循環さ押します。
列番号=定数 - がすべての主要な対角線のための+定数行番号=列番号は、全ての行番号は、対角線のビューを持っています。
これは、私たちは、攻撃範囲の対角マークを持ち、攻撃位置にいるかどうかボックス(行番号、列番号)を確認することを可能にします。
今、あなたは、関数、バックトラック(行= 0)を書き戻すことができます。
開始= 0から最初の行。
サイクルと女王の各列に列を配置しようとする試み。
- グリッド(行、列)は、攻撃の範囲内にない場合
- (行、列)でグリッドクイーン上に配置されます。
- 行、列、対角線に対応する負の位置。
- すべての行が考慮される場合、行== N
- 我々は解決策を見つけた手段
- エルス
- 女王は次の場所のバックトラック(行+ 1)を考慮し続けています。
- バック:(行、列)の二乗クイーンで除去されます。
- グリッド(行、列)は、攻撃の範囲内にない場合
1 |
クラス (オブジェクト):DEF solveNQueens (自己、N) :"" " :タイプN:INT :RTYPE:リスト[リスト[STR] """ DEF could_place (行、列):復帰しない(COLS [COL] +丘[行- COL] +デール[行+ COL]) DEF place_queen (行、列): queens.add((行、列)) COLS [COL = 1つの 丘[行- COL = 1 デール[行+ COL = 1 DEF remove_queen (行、列): queens.remove((行、列)) |
思考2:DFS
エイトクイーン問題は、より一般的な場所に拡張n個の問題をQUEENSすることができます。この時、ボードの大きさはN×Nとなり、女王は、n数となっています。場合にのみ、N = 1又はN≥4ときに問題解ける場合。
对于任意(x,y),如果要让新的点和它不能处于同一条横行、纵行或斜线上,则新点(p,q)必须要满足p+q != x+y 和p-q!= x-y, 前者针对左下右上斜线,后者针对左上右下斜线,两者同时都保证了不在同一条横行和纵行上。
代码中变量的含义:
- cols_lst: 每一行皇后的column位置组成的列表
- cur_row:目前正在判断的row的index
- xy_diff:所有x-y组成的列表
- xy_sum:所有x+y组成的列表
1 |
class (object): |
2. N皇后2(Hard)
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
示例:
1 |
输入: 4 |
解答:
思路:
和上题完全一模一样,只是最后输出的时候,输出的是结果的长度。
1 |
class (object): |
3. 最大子序和(Easy)
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
1 |
输入: [-2,1,-3,4,-1,2,1,-5,4], |
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
解答:
思路:
这道题很简单,动态规划,逐步更新局部最优解和全局最优解。
1 |
class (object): |
4. 螺旋矩阵(Medium)
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
1 |
输入: |
示例 2:
1 |
输入: |
解答:
思路:
绘制螺旋轨迹路径,我们发现当路径超出界限或者进入之前访问过的单元格时,会顺时针旋转方向。
算法
假设数组有R 行 C 列,seen[r][c]表示第 r 行第 c 列的单元格之前已经被访问过了。当前所在位置为 (r, c),前进方向是 di。我们希望访问所有 R x C 个单元格。
当我们遍历整个矩阵,下一步候选移动位置是(next_r, next_c)。如果这个候选位置在矩阵范围内并且没有被访问过,那么它将会变成下一步移动的位置;否则,我们将前进方向顺时针旋转之后再计算下一步的移动位置。
1 |
class (object): |
5. 跳跃游戏(Medium)
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
1 |
输入: [2,3,1,1,4] |
示例 2:
1 |
输入: [3,2,1,0,4] |
解答:
思路:
这个题很好想。
就是从后往前倒推,如果倒数第二个能到底倒数第一个位置,那么可以就去求是否可以达到倒数第二个位置。
就是反复往回推的过程。
1 |
クラス のソリューション(オブジェクト):デフcanJump (自己、NUMS) :"" " :タイプNUMS:リスト[INT] :RTYPE:BOOL """ (NUMS)lenの最後= -1 のために、私は中範囲(LEN(NUMS) - 1、 -1、 -1):もし I + NUMS [I]> =最後: 私が最後=戻り最後== 0 |