数据结构–递归/回溯/分治/动态规划
1.递归
将一个数据序列中的相同的数字放在同一个篮子中,使得每个篮子中的数字个数相同且每个篮子的个数大于等于2,若能恰好分红,则返回篮子个数,否则返回0.
比如 ‘2 2 3 3’, 将 两个2和两个3,分别放在一个篮子里,返回为2.
比如‘2 2 3 3 3’ 无法平均放入篮子,返回0
比如‘2 3 4 4 2 3 4 4’, 返回4.
# -*- coding: utf-8 -*-
"""
Created on Wed Apr 24 19:43:12 2019
@author: janti
"""
# In[]
def count_blankets(dicta,s,min_count):
count=0
flag=1
while min_count>=2:
for i in range(len(s)):
if (dicta[s[i]] % min_count)==0:
count+=dicta[s[i]]/min_count
else:
flag=0
count=0
min_count-=1
count_blankets(dicta,s,min_count)
if flag:
break
return count
# In[]
n=9
line='2 3 4 2 3 4 4 4 4'
dicta={}
s=[]
for i in range(n):
data=int(line.split()[i])
if data in dicta:
dicta[data]+=1
else:
dicta[data]=1
s.append(data)
# In[]
min_count=1000
for i in range(len(s)):
if dicta[s[i]]<min_count:
min_count=dicta[s[i]]
if min_count<2:
res=0
else:
res=int(count_blankets(dicta,s,min_count))
print(str(res) + "\n")
通过LeetCode上【70. 爬楼梯】学习(建议)
2. 回溯
2.1 矩阵中的最长递增子序列
找出矩阵中的最长递增路径
import numpy as np
def Findlongpath(matrix,i,j,len_vect):
if len_vect[i][j]:
return len_vect[i][j]
cols=len(matrix)
rows=len(matrix[0])
maxlen=0
if i >0 and matrix[i-1][j]>matrix[i][j]:
maxlen=max(maxlen,Findlongpath(matrix,i-1,j,len_vect))
if i<cols-1 and matrix[i+1][j] > matrix[i][j]:
maxlen=max(maxlen,Findlongpath(matrix,i+1,j,len_vect))
if j>0 and matrix[i][j-1]>matrix[i][j]:
maxlen=max(maxlen,Findlongpath(matrix,i,j-1,len_vect))
if j<rows-1 and matrix[i][j+1] > matrix[i][j]:
maxlen=max(maxlen,Findlongpath(matrix,i,j+1,len_vect))
len_vect[i][j] = maxlen+ 1
return len_vect[i][j]
# In[]
matrix=[[2,3,4],[3,4,5],[6,7,8]]
cols=len(matrix)
rows=len(matrix[0])
max_len_matrix=1
len_vect=np.zeros((cols,rows))
for i in range(cols):
for j in range(rows):
len_vect[i][j]=Findlongpath(matrix,i,j,len_vect)
max_len_matrix=max(max_len_matrix,len_vect[i][j])
print(max_len_matrix)
参考链接:
https://www.cnblogs.com/fanmu/p/9636076.html
利用回溯算法求解 0-1 背包问题
利用回溯算法求解八皇后问题
3. 分治
利用分治算法求一组数据的逆序对个数
4. 动态规划
4.1 0-1 背包问题
5、表格填完,最优解即是V(number,capacity)=V(4,8)=10。
6、代码实现:
(后期补充)
内容来自以下链接:
https://blog.csdn.net/qq_38410730/article/details/81667885
https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html
4.2 最长递增子序列
编程实现一个数据序列的最长递增子序列
参考链接:
https://blog.csdn.net/love20165104027/article/details/79618367
最小路径和(详细可看 Minimum Path Sum)
编程实现莱文斯坦最短编辑距离
编程实现查找两个字符串的最长公共子序列
对应的 LeetCode 练习题
实战递归:完成Leetcode上的Letter Combinations of a Phone Number(17)及permutations(46)
实战DP:完成0-1背包问题实现(自我实现)及Leetcode上Palindrome Partitioning II(132)
补充题目:leetcode198 House Robber
Regular Expression Matching(正则表达式匹配)
英文版:
https://leetcode.com/problems/regular-expression-matching/
中文版:
https://leetcode-cn.com/problems/regular-expression-matching/
Minimum Path Sum(最小路径和)
英文版:
https://leetcode.com/problems/minimum-path-sum/
中文版:
https://leetcode-cn.com/problems/minimum-path-sum/
Coin Change (零钱兑换)
英文版:
https://leetcode.com/problems/coin-change/
中文版:
https://leetcode-cn.com/problems/coin-change/
Best Time to Buy and Sell Stock(买卖股票的最佳时机)
英文版:
https://leetcode.com/problems/best-time-to-buy-and-sell-stock/
中文版:
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/
Maximum Product Subarray(乘积最大子序列)
英文版:
https://leetcode.com/problems/maximum-product-subarray/
中文版:
https://leetcode-cn.com/problems/maximum-product-subarray/
Triangle(三角形最小路径和)