Leetcode训练营笔记(DataWhale开源社区)(2022春)
文章目录
1.线性结构
1.1数组
1.1.1课堂内容
a.一二三维数组公式:
一
维
数
组
:
L
o
c
(
a
[
i
]
)
=
L
o
c
(
a
[
0
]
)
+
i
∗
c
二
维
数
组
:
L
o
c
(
a
[
i
,
j
]
)
=
L
o
c
(
a
[
0
]
[
0
]
)
+
(
i
∗
n
+
j
)
∗
c
三
维
数
组
:
L
o
c
(
a
[
i
,
j
,
k
]
)
=
L
o
c
(
a
[
0
]
[
0
]
[
0
]
)
+
(
i
∗
n
∗
l
+
j
∗
l
+
k
)
∗
c
一维数组:Loc(a[i])=Loc(a[0])+i*c\\ 二维数组:Loc(a[i,j])=Loc(a[0][0])+(i*n+j)*c\\ 三维数组:Loc(a[i,j,k])=Loc(a[0][0][0])+(i*n*l+j*l+k)*c
一维数组:Loc(a[i])=Loc(a[0])+i∗c二维数组:Loc(a[i,j])=Loc(a[0][0])+(i∗n+j)∗c三维数组:Loc(a[i,j,k])=Loc(a[0][0][0])+(i∗n∗l+j∗l+k)∗c
1.1.2课堂例题
a.T15最接近三数之和
题目:
解:
O( n 3 n^3 n3)解法:
嵌套三层循环,寻找和的绝对值最接近的数
O( n 2 n^2 n2)解法:
def solution(nums,target):
nums.sort()
result = nums[0] + nums[1] + nums[2] #用result记录最接近的值
for(i=0;i<len(nums)-2;++i):
start = i + 1
end = len(nums) - 1
while(start<end):
summ = nums[i] + nums[start] + nums[end] #用summ记录一次循环的总和
if(abs(target-summ)<abs(target-result)): #如果summ更接近target,则将result更新为新的summ
result = summ
if(summ>target): #summ大了就将最后一个元素往前移,反之将中间的元素往后移
--end
else if(summ<target):
++start
else: #result与target相等,直接返回result
return result
return result
b.T26移除元素
题目:
解:
前后双指针解决
def removeElement(nums: list, val: int):
start = 0 #双指针
end = len(nums) - 1
res = len(nums)
while start <= end: #start与end重合时停止
if nums[start] == val:
temp = start #temp用于删除元素时临时指针
res -= 1
while temp != end: #temp与end重合时停止删除
nums[temp] = nums[temp+1]
temp+=1
end -= 1
if(nums[start] == val): #更新后元素仍为val,则重复循环
continue
else:
start += 1
return res
numsTest = [0,1,2,2,3,0,4,2]
print(removeElement(numsTest, 2))