一、每日一题
大佬题解:
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
res = set()
temp = set()
for i in range(len(nums)):
mydict = set()
if nums[i] in temp: continue
for j in range(i+1, len(nums)):
target = -nums[i] - nums[j]
if target in mydict:
a = [nums[i], nums[j], target]
a.sort()
res.add(tuple(a))
else: mydict.add(nums[j])
temp.add(nums[i])
return list(res)
作者:芹菜
链接:https://leetcode.cn/problems/3sum/solutions/2605424/liang-shu-zhi-he-de-xiang-fa-jie-jue-san-mco7/
来源:力扣(LeetCode)
代码详细解释:
-
res = set()
: 创建一个空的集合res
,用于存储找到的结果。 -
temp = set()
: 创建一个空的集合temp
,用于存储已经遍历过的数字,避免重复计算。 -
for i in range(len(nums)):
: 开始遍历列表nums
中的每个数字。 -
mydict = set()
: 创建一个空的集合mydict
,用于存储当前数字nums[i]
之后的数字,避免重复计算。 -
if nums[i] in temp: continue
: 如果当前数字nums[i]
已经在temp
中出现过(即已经计算过),则跳过本次循环。 -
for j in range(i+1, len(nums)):
: 对于当前数字nums[i]
,开始从它之后的数字进行遍历。 -
target = -nums[i] - nums[j]
: 计算目标值,使得nums[i] + nums[j] + target = 0
。 -
if target in mydict:
: 如果目标值target
在mydict
中已经存在,则说明找到了一个满足条件的结果。 -
a = [nums[i], nums[j], target]
: 将满足条件的三个数字组成列表。 -
a.sort()
: 对列表a
进行排序,确保结果中的数字顺序是升序的。 -
res.add(tuple(a))
: 将排序后的列表转换成元组,并添加到结果集合res
中。 -
else: mydict.add(nums[j])
: 如果目标值target
不在mydict
中,则将当前数字nums[j]
添加到mydict
中,以备后续计算使用。 -
temp.add(nums[i])
: 将当前数字nums[i]
添加到temp
中,表示已经计算过。 -
return list(res)
: 将结果集合res
转换成列表,并返回结果。
综上所述,该函数通过两层循环遍历列表中的数字,利用集合来避免重复计算,找出所有满足三数之和为 0 的不重复子数组,并返回结果列表。
ps:我的思路大致就是这样,先遍历列表确定一个数,剩下两个数之和再在列表中寻找,但是没有考虑到元素重复的问题,还有升序降序的问题没有考虑到,自己试了试运行不出来就先学习大佬的吧,在逐步转换成自己的东西。
二、插入排序
把插入排序看作打牌的时候摸牌排序的过程。
排序过程思路
以将3插入为例:
根据上图思路,代码实现:
def insert_sort(li):
for i in range(1, len(li)): # i表示摸到牌的下标
tmp = li[i]
j = i - 1 # j 是指手里牌的下标
while j >= 0 and li[j] > tmp:
li[j+1] = li[j]
j -= 1
li[j+1] = tmp
print(li)
li = [5, 4, 7, 3, 2, 6, 9, 1,8]
print(li)
insert_sort(li)
运行结果
三、学习总结
至此!排序最简单的三个就学完了!三种排序的时间复杂度都是 O(n*n),我觉得插入排序是最不好理解的,因为元素向后移动和指针的移动很容易让人弄混。在学习的时候还是要理解记忆,别死记硬背,要不然背的真的很痛苦。坚持学习一个星期了!继续加油!
“我相信,慢慢来是一种诚意。”