给定一个正整数 n,生成一个包含 1 到 n² 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
与54. 螺旋矩阵类似。
只需要依次给新数组中的相应元素赋值即可。
Solution:
1 | class Solution { |
给定一个正整数 n,生成一个包含 1 到 n² 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
与54. 螺旋矩阵类似。
只需要依次给新数组中的相应元素赋值即可。
1 | class Solution { |
给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。
注意:
输入: 5
输出: 2
解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。
1 | class Solution { |
首先找到该数是从哪一位开始才算有效(即不包含前面零的位置。)
再将该数所有位取反,
然后用全位置的1左移cot次,与值异或即可。
异或:不同为一,相同为零,所以当前面的零取反后成为一后,相应位置与1异或,会恢复成为0,之后的有效位还保持不变。
该题为著名的n皇后问题。
1 | class Solution { |
该题考查对递归与回溯算法的掌握。
使用一个矩阵来存储是否可以放皇后的状态。
每当一行放置了一个皇后后,更新其状态,并在下一行中挑选合适的位置来放置该行的皇后。
直到每一行都放置了皇后,保存状态,返回上一个递归过程。
回溯主要针对矩阵的状态和皇后放置的位置,以便利于递归返回过程中的再次使用。
此题55. 跳跃游戏的进阶版
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
按照前面题的思路,依然是从后往前搜索。每次搜索能跳到当前位置的最远位置。
1 | class Solution { |
用了两层循环,发现能ac,但是又排在了末名。
看了大神的代码,写出了下面的代码:
1 | class Solution { |
跳到当前所能跳到的最远的位置所在的位置中。
记录当前位置所能到达的最远的位置。
如果做到了该最远位置,更新一下。继续走。
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
[1,2,2],
[5]
]
该题为90. 子集 II的升级版
与上题相同的是,都要保证元素的非重复性,所以与上题使用set部分的代码是一致的。
区别在于在进行递归的过程中,需要随时对条件进行判断,只有满足等于target,才往result中添加。
并且在剪枝的时候,如果元素之和已经比target大,就没有必要进行下去了,直接退出即可。
1 | class Solution { |
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例:
输入:
s = “abcd”
t = “abcde”输出:
e解释:
‘e’ 是那个被添加的字母。
1 | class Solution { |
与136. 只出现一次的数字一样的思路,考察异或的使用。
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
1 | class Solution { |
从矩阵的左上角出发,如果比目标值大,向左移,如果比目标值小,向下移。出界或找到则结束。
对于一列,如果比当前值小,说明不在当前列中,列减一(缩小搜索范围)。
对于一行,如果比当前值小,则往前移动一个位置。
经过不断缩小范围(以经过的点划矩形),就可以得知目标值是否存在矩阵中。
1 | //获得链表长度 |
借助stack。
将mid之前的元素值都push进stack中,然后到mid之后,将每个元素与栈顶值比较。不相等退出,相等继续下一轮。
1 | //获得链表长度 |
将链表的后半段翻转,从翻转位置开始与从头结点开始,依次比较(listlen/2次)。
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
1 | /** |
ONELINE版:1
2
3
4
5
6class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return ((root->val - p->val) * (root->val - q->val) < 1) ? root: lowestCommonAncestor(root->val < p->val ? root->right : root->left, p, q ) ;
}
};
1 | (root->val - p->val) * (root->val - q->val) < 1 |
这段代码表示给定的两个结点是否在当前节点的两个不同的子树上,或者两个节点中有节点与当前所在节点相同。如果是,则该节点就是最近公共祖先。如果不是,说明在同一棵子树上,转移到该子树上继续递归调用。
1 | class Solution { |
与上面思路类似。