备战蓝桥杯Day7- 插入排序

一、每日一题

大佬题解:

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)

代码详细解释: 

  1. res = set(): 创建一个空的集合 res,用于存储找到的结果。

  2. temp = set(): 创建一个空的集合 temp,用于存储已经遍历过的数字,避免重复计算。

  3. for i in range(len(nums)):: 开始遍历列表 nums 中的每个数字。

  4. mydict = set(): 创建一个空的集合 mydict,用于存储当前数字 nums[i] 之后的数字,避免重复计算。

  5. if nums[i] in temp: continue: 如果当前数字 nums[i] 已经在 temp 中出现过(即已经计算过),则跳过本次循环

  6. for j in range(i+1, len(nums)):: 对于当前数字 nums[i],开始从它之后的数字进行遍历。

  7. target = -nums[i] - nums[j]: 计算目标值,使得 nums[i] + nums[j] + target = 0

  8. if target in mydict:: 如果目标值 targetmydict 中已经存在,则说明找到了一个满足条件的结果。

  9. a = [nums[i], nums[j], target]: 将满足条件的三个数字组成列表。

  10. a.sort(): 对列表 a 进行排序,确保结果中的数字顺序是升序的。

  11. res.add(tuple(a)): 将排序后的列表转换成元组,并添加到结果集合 res 中。

  12. else: mydict.add(nums[j]): 如果目标值 target 不在 mydict 中,则将当前数字 nums[j] 添加到 mydict 中,以备后续计算使用。

  13. temp.add(nums[i]): 将当前数字 nums[i] 添加到 temp 中,表示已经计算过。

  14. 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),我觉得插入排序是最不好理解的,因为元素向后移动和指针的移动很容易让人弄混。在学习的时候还是要理解记忆,别死记硬背,要不然背的真的很痛苦。坚持学习一个星期了!继续加油!

“我相信,慢慢来是一种诚意。”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值