00-1010使用连续的内存空间来存储一组相同数据类型的元素。使用下标访问元素;适合多读少更新(有序状态下删除或添加)的场景。
使用下标访问元素的时间复杂度为O(1)。缺陷占据的空间必须是连续的。扩展容量时,需要将原始数组中的元素移动到新空间。当元素被排序时,在添加或删除元素时需要移动数据。示例(leetcode-1588)给出了一个正整数数组arr。请计算所有可能的奇数子阵列的总和。
子阵列被定义为原始阵列中的连续子序列。
请返回arr中所有奇数长度子阵的和。
输入:arr=[1,4,2,5,3]
产出:58
说明:所有奇数长度的子阵及其和为:
[1]=1
[4]=4
[2]=2
[5]=5
[3]=3
[1,4,2]=7
[4,2,5]=11
[2,5,3]=10
[1,4,2,5,3]=15
我们把所有的值相加,得到1 4 2 5 3 7 11 10 15=58。
def sum(arr):
'''
辅助数组sumArr:的每一项代表数组Arr中前n项元素的总和。
1.遍历数组arr,计算数组前n项之和并写入sumArr(第一项值位0),计算每个元素之和(子数组长度为1)。
2.根据[3,5]的步长.数组长度]范围(3,len(arr),2),计算每个奇数子区间的元素和。
:类型arr:列表[int]
:rtype: int
'''
#保存所有连续奇数子区间数组的总和
总和=0
#数组长度1是为了代码简单,sumArr长度比Arr大1,
#第0个位置的元素值为0;sumar[j]-sumar[j-I]可以在计算奇数子区间值时统一使用,类似于easy发夹效应3360。否则,第一个奇数子区间的写入与后面的写入不同。
l=len(arr) 1
#保存数组arr中前n项的总和
sumArr=[范围(l)中I的0]
# 1.计算arr的前n项之和
#因为单个元素是元素个数为1的子区间,所以遍历时可以直接求和;
对于范围(1,l):中的I
#长度为1的子阵列之和
sum=arr[I-1];
# arr中前n项的总和
sumar[I]=sum
#计算奇数长度的子阵列间隔之和。
#子阵列的最小长度
i=3
而我:
j=I;
#每个子区间的和是sumArr中区间I的两个元素之差。
而j l:
sum=sumArr[j] - sumArr[j - i]
j=1
i=2
返回示意图
00-1010每个元素包含两部分:数据和指针。物理上,它可以连续或不连续存储。除了头节点和尾节点,单个链表中的所有其他节点都有一个前序节点和一个后序节点。从逻辑上讲,它就像一条连接在一起的链条。
优点每个元素占据的空间可以是连续的,也可以是不连续的。向链表头部添加元素的时间复杂度为O(1),所以只要有足够的内存就可以添加任何元素。删除(中间位置)元素时,不需要移动元素,只需将前节点的下一个指针指向待删除节点的后节点即可。缺点:不支持随机访问。访问元素时,只能从节点的开始处开始顺序遍历链表。分类单一链接列表
单向循环链表
双向链表
双向循环链表
例子
输入两个链表,找到它们的第一个公共节点。
类别列表节点(对象):
'''
链表节点
'''
def __init__(self,x):
self.val=x
自我。下一个=无
def getIntersectionNode(self,headA,HedB):
'''
:键入标题1,标题1:列表节点
:rtype:列表节点
'''
#链表的长度
l1=0
#链表A的头节点
hA=headA
#链表的长度
l2=0
#链表B的头节点
hB=headB
#返回值
r=无
#计算链表a的长度。
而hA:
l1=1
hA=hA.next
#计算链表b的长度。
而hB:
l2=1
hB=hB.next
#首先将具有多个节点的链表移动到abs(l1-l2)节点,这样headA和headB的剩余节点数相同
hA=headA
hB=headB
i=0
如果l1 l2:
而i l1 - l2:
hA=hA.next
i=1
else:
而i l2 - l1:
hB=hB.next
i=1
# 查找相同的节点
而哈和hB:
if hA==hB:
r=hA
破裂
else:
hA=hA.next
hB=hB.next
返回r示意图