给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
Solution:
1 | class Solution { |
使用递归+回溯来解决。
该题主要是要找放括号的时机。
首先要先放左括号。
第二,只要放左括号的个数比右括号多,就可以放右括号。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
1 | class Solution { |
使用递归+回溯来解决。
该题主要是要找放括号的时机。
首先要先放左括号。
第二,只要放左括号的个数比右括号多,就可以放右括号。
颠倒给定的 32 位无符号整数的二进制位。
示例 1:
输入: 00000010100101000001111010011100
输出: 00111001011110000010100101000000
解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
1 | class Solution { |
思路:
初始化一个全位置为0的数,将原数的最后一位赋给该数的最后一位,原数右移,该数左移,如此32次。
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
1 | class Solution { |
使用双指针技巧,一个从前扫描,一个从后扫描。符合条件退出。
1 | class Solution { |
将每一位移到最后一位检查是否为1,到0为止,最后返回个数。
由于是无符号整型,每次都会执行32次,所以时间复杂度是O(1)。
Solution2(优化):
1 | class Solution { |
看了官方题解,这种方法是每一次将最后一个1给消除。这样顶多执行k次,k就为1的个数。这样就又优化了一点点计算。
eg:
11010 & 11001 = 11000
11000 & 10111 = 10000
10000 & 01111 = 0
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
有了上面的思路:
这道题就可以写成这样:
1 | class Solution { |
2的n次方在二进制中就是只有1个位置是1,其他全是0(对于正数)。
1 | class Solution { |
与141号问题的Solutions1一个思路,直接使用set。只不过返回的是结点不是boolean值罢了。
1 | class Solution { |
这种方法只会使用O(1)的空间。
该方法的思路需要一点数学基础:
在一个有环的链表中,slow指针与fast指针相遇,从该相遇的位置开始,与链表的头位置开始,两者走同样的步数,如果两者相交,就走到了环的开始位置。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
你可以假设数组中不存在重复元素。
示例 1:
1 | 输入: [3,4,5,1,2] |
示例 2:
1 | 输入: [4,5,6,7,0,1,2] |
1 | class Solution { |
使用二分法。
当中间元素比右边界要大时,说明在逆序数组中,这时,令lo = mid + 1。
否则说明在顺序数组中,不断缩小范围直到 lo = hi 时,返回。
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
1 | class Solution { |
使用异或来消除相同的元素。
异或:
两数相同,异或为0;
两数不同,异或为1;
该题为112. 路径总和的升级版
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
1 | /** |
1 | /** |
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
1 | /** |
递归终止条件为叶子节点。
该题为 102. 二叉树的层次遍历的进阶版。
有关102. 二叉树的层次遍历的题解,请参考429. N叉树的层序遍历,具体思路是一样的,不再赘述。
1 | class Solution { |
1 | class Solution { |
具体思路就是增加一层,就将该层放到头位置。
vector.emplace()配合vector.begin()实现插到头位置。