数据结构
1.单链表结构与顺序存储结构优缺点
- 存储分配方式
- 顺序存储结构用一段连续的存储单元依次存储线性表的数据元素
-单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素
- 顺序存储结构用一段连续的存储单元依次存储线性表的数据元素
- 时间性能:
- 查找
- 顺序存储结构O(1)
- 单链表O(n)
- 插入和删除
- 顺序存储结构需要平均移动表长一半的元素,时间为O(n)
- 单链表在计算出某位置的指针后,插入和删除时间仅为O(1)
- 空间性能:
- 顺序存储结构需要预测分配存储空间,分大了,容易造成浪费,分小了,容易发送溢出。
- 单链表不需要分配存储空间,只要有就可以分配,元素个数也不受限制
- 综上所述对比,我们得出一些经验性的结论:
- 若线性表需要频繁查找,很少进行插入和删除操作。宜采用顺序存储结构
- 若需要频繁插入和删除时,宜采用单链表结构。
- 查找
- 单链表的插入删除操作
- 静态链表
每日一题
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字都是正整数。
解集不能包含重复的组合。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码如下:
k = 3
n = 9
nums = [i for i in range(1, 10)]
candidates = nums
target = n
# 对初始列表进行简化处理
res = [] # 记录结果
# 删除函数
def candidates_del(x, y):
j = 0
for i in x:
j = j + 1
if i >= y:
del x[j:]
break
candidates_del(candidates, target)
t = min(candidates)
n = len(candidates)
def backtrace(rs_candidates, rs_target, curr_res, s):
# 跳出条件
if (rs_target == 0) & (len(curr_res) == k):
res.append(curr_res[:])
return
elif rs_target < t:
return
for i in range(s, n):
curr_res.append(rs_candidates[i])
backtrace(rs_candidates, rs_target - rs_candidates[i], curr_res, i + 1)
curr_res.pop()
backtrace(candidates, target, [], 0)
print(res)