#1
搜索的主要技术有?
暴力法:
很多问题只能用暴力法解决;
小规模问题,暴力法完全够用;可以加快解题速度;
把暴力法当作参照,可以试试暴力法,看是否能帮助产生灵感;
暴力法可以产生数据,作为高级算法的验证法;
暴力法的主要操作是:
BFS = 队列
DFS = 递归栈
#2
递归求排列组合?
(1)让第一个数不同,得到n个数列;把第一个数和后面的每个数交换。
(2)忽视第一个数,对后面的n-1个数进行类似的操作。
(3)重复至用完所有数字
def perm(begin, end):
if begin == end:
num +=1
else:
for i in range(begin, end+1):
nums[i] ,nums[begin] = nums[begin], nums[i]
perm(begin+1, end)
nums[i], nums[begin] = nums[begin], nums[i]
#3
打印n个数中,任意m个数的全排列。
当end = m+1
#4
5 & 1 << k 是什么意思?
#5
k & k-1 是什么意思?
消除二进制数的最右边的一个1;
#6
n = 0
while k:
k = k & k-1
n += 1
请问上一段代码n表示什么意思?
统计二进制数中,1的个数
#7
子集生成和组合问题
{a,b,c}
001 -> {c}
011 -> {b,c}
111 -> {a,b,c}
1. 一个 二进制数 对应 一个组合
2. n个元素的集合,有2^n个子集
for i in range(2**n):
#对于每个二进制数,打印里面的所有1
res = []
for j in range(n):
if i &(1<<j)):
res.append(nums[-j]) # the jth position from the rightest to left
print(res)