数据结构算法
1.线性表的抽象数据类型
2.线性表的顺序存储结构
- 顺序存储结构和链式存储结构
- 顺序存储结构指的是用一段地址连续的存储单元依次存储线性表的数据元素
3.顺序存储结构封装需要的三个属性
- 存储空间的起始位置,数组data,它的存储位置就是线性表存储空间的存储位置
- 线性表的最大存储容量:数组的长度MaxSize。
- 线性表的当前长度:length
4.顺序表的插入、删除操作
5.线性表顺序存储结构的优缺点 - 优点:
- 无须为表示表中元素之间的逻辑关系而增加额外的存储空间
- 可以快速地存取表中任意的元素
- 缺点:
- 插入和删除操作需要移动大量元素
- 当线性表长度变化较大时,难以确定存储空间的容易
- 容易造成存储空间的“碎片”。
6.链式存储
- 头指针
- 头指针时指链表指向第一个节点的指针,若链表有头结点,则是指向头结点的指针
- 头指针具有标识作用,所以常用头指针冠以链表的名字(指针变量的名字)
- 无论链表是否为空,头指针均不为空。
- 头指针是链表的必要元素
- 头结点
-头结点是为了操作的统一和方便而设立的,放在第一个元素的结点之前,其数据域一般无意义(但也可以用来存放链表的长度)- 有了头结点,对在第一元素结点前插入结点和删除第一结点其操作与其它结点的操作就要统一了。
- 头结点不一定是链表的必须要素
7.单链表的读取
每日一题
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
[1,2,2],
[5]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
candidates=[10, 1, 2, 7, 6, 1, 5]
target = 8
# 对初始列表进行简化处理
candidates.sort()
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)
# print(candidates)
# 完成简化初始数组
# 选取出列表中最小的作为判断值t
t = min(candidates)
n = len(candidates)
# print(t)
def backtrace(rs_candidates, rs_target, curr_res, s):
# 跳出条件
if rs_target == 0:
res.append(curr_res[:])
# print('成功路线')
# print(res)
return
elif rs_target < t:
# print('失败路线')
return
for i in range(s, n):
if (i > s) & (rs_candidates[i-1] == rs_candidates[i]):
continue
# print(rs_target)
curr_res.append(rs_candidates[i])
# print(curr_res)
# 删除
# 开始回溯
backtrace(rs_candidates, rs_target - rs_candidates[i], curr_res, i + 1)
curr_res.pop()
# print(candidates)
backtrace(candidates, target, [], 0)
print(res)