是一些题目的一些解法,只是列出从中学会的新知识点
1.深度优先搜索
2.宽度优先搜索
3.逆序对(基于递归二分 归并排序)
*4.树状数组
此题本质就是求解逆序对的个数
#通过归并排序统计逆序对,基于分治法
def f2(l1,l2):
cou = 0
i = 0
j = 0
ans = []
while i<len(l1) and j<len(l2):
if l1[i]<l2[j]:
ans.append(l1[i])
i += 1
else:
ans.append(l2[j])
j += 1
cou += (len(l1)-i)
ans += l1[i:]
ans += l2[j:]
return ans,cou
def f(L):
if len(L)==1:return L,0
l,countl = f(L[:len(L)//2])
r,countr = f(L[len(L)//2:])
ans,count = f2(l,r)
return ans,count+countl+countr
L = [int(e) for e in input().split()]
a,c = f(L)
print(c)
逆序对就是 i<j,ai>aj ,结合归并排序与二分法,先假设将列表二分,已经得到两个按升序排好序的列表(二分递归思想),按位比较大小插入新列表,若右列表比左列表先插入新列表,就意味着左列表中的剩余元素都与右列表中的这个元素构成了逆序对,因此计数时加上左列表剩余元素的个数。
又是没懂的一种方法 o(╥﹏╥)o
def lowbit(i):
return i&(-i)
def Sum(c, num):
if num == 0: return 0
ans = 0
while num>=1:
ans += c[num]
num -= lowbit(num)
return ans
def change(c, num):
while num<=100000:
c[num] += 1
num += lowbit(num)
def test01(A):
ans = 0
c = [0] * 100005
for i in range(len(A)-1, -1, -1):
ans += Sum(c, A[i]-1)
change(c, A[i])
return ans
def test01_1(A):
ans = 0
for i in range(len(A)):
for j in range(0, len(A)-1-i):
if A[j] > A[j+1]:
ans += 1
A[j], A[j+1] = A[j+1], A[j]
return ans
test01([3,4,2,1])
#求一个字符串的所有子序列个数(含动态规划思想)
A = {}
string = input()
for i in string:
L = []
for key in A.keys():
L.append(key)
for e in L:
A[e+i] = 1
A[i] = 1
print(len(A))
假设A中存放的是前i项字符串的子序列,只需把新的字符加在这些子序列后面即可,先用一个L放A中的子序列,再循环这些子序列,加入新字符,再把新增的子序列加进A
#求一个字符串中的所有子序列个数(深度优先搜索)
A = {}
string = input()
def dfs(c,s):
if c>=len(string):
A[s] = 1
return ##这里一定要记得return !!!
dfs(c+1,s)
dfs(c+1,s+string[c])
dfs(0,'')
print(len(A)-1) ##列表中有个空字符串,要 -1
从一个空字符串开始,依次以每一个字符为节点,考虑选还是不选
都要记得用一个字典去重
#宽度优先搜索
import queue
n = int(input())
def f(n):
mark = [0]*2000001
#mark[1]=1
que = queue.Queue()
que.put(1)
while not que.empty():
k = que.get()
if k==n:return (mark[k])
if k<n and not mark[k+1]:
mark[k+1] = mark[k] + 1
que.put(k+1)
if k<n and not mark[k*2]:
mark[k*2] = mark[k] + 1
que.put(k*2)
if k>1 and not mark[k-1]: #这里是k>1,而不是k>n
mark[k-1] = mark[k] + 1
que.put(k-1)
print(f(n))
放在函数中做全局变量时运行的更快
这个方法还没有弄懂啊!!
n=int(input())
f=[0,0]
for i in range(2,n+1):
if (i%2==0):
f.append(min(f[i//2]+1, f[i-1]+1))
else:
f.append(min(f[i-1]+1, f[i//2+1]+2))
print(f[n])