Leetcode 15 -- 三数之和 --Python

Leetcode 15 -- 三数之和 --Python

题目

在这里插入图片描述

题目分析

  • 首先看到题目,不知道大家有没有觉得和两数之和的题目有些相似。最直接的方法就是暴力法,设置三个for循环,时间复杂度为O(n3), 空间复杂度为O(1),此方法虽简单,但是会超过时间限制。代码段如下
//暴力法
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:        
        new_three = []
        nums.sort()
        for i, j in enumerate(nums):
            for m in range(i+1,len(nums)):
                for n in range(m+1, len(nums)):
                    if j+nums[m]+nums[n] == 0:
                        temp = [j, nums[m], nums[n]]
                        flag = 0       //判断三元组是否重复的一个标志
                        for p, q in enumerate(new_three):
                            if set(q) == set(temp):
                                flag = 1
                        if flag == 0:
                             new_three.append(temp)
        return new_three
                        
  • 下面介绍第二种方法:
    (1)题目中最后要得到三个数,而且不能重复是关键,所以首先我们给nums排序,只需要一个for循环即可,利用for循环确定三个数中的第一个,因为我们已经排好序,如果第一个数大于0,就不需要再去找之后的两个.
    (2) 确定了第一个数之后,在nums之后的列表里可以采用双指针,一个头指针m一个尾指针n,有点类似快速排序的思想,用while,如果m>n,结束一次while。代码段如下
//双指针法
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:                
        nums.sort()
        new_three = []
        for i in range(len(nums)-2):
            if (i==0 or nums[i]>nums[i-1]) and nums[i]<1:
                m = i+1
                n = len(nums)-1
                while m<n:
                    if nums[i]+nums[m]+nums[n] == 0:
                        temp = [nums[i], nums[m], nums[n]]
                        new_three.append(temp)
                        if m+1== len(nums)-1:
                            break
                        while nums[m+1]==nums[m] and m<n:
                            if m+1== len(nums)-1:
                                break
                            m = m+1
                        while nums[n-1]==nums[n] and n>m:
                            n = n-1
                        
                        n = n-1
                        m = m+1
                    elif nums[i]+nums[m]+nums[n] > 0:
                        n=n-1
                    elif nums[i]+nums[m]+nums[n] < 0:
                        m=m+1
        return new_three
                        

每天一点进步,加油!。1


  1. @Qichao ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本项目是一个基于SpringBoot开发的华府便利店信息管理系统,使用了Vue和MySQL作为前端框架和数据库。该系统主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者,包含项目源码、数据库脚本、项目说明等,有论文参考,可以直接作为毕设使用。 后台框架采用SpringBoot,数据库使用MySQL,开发环境为JDK、IDEA、Tomcat。项目经过严格调试,确保可以运行。如果基础还行,可以在代码基础之上进行改动以实现更多功能。 该系统的功能主要包括商品管理、订单管理、用户管理等模块。在商品管理模块中,可以添加、修改、删除商品信息;在订单管理模块中,可以查看订单详情、处理订单状态;在用户管理模块中,可以注册、登录、修改个人信息等。此外,系统还提供了数据统计功能,可以对销售数据进行统计和分析。 技术实现方面,前端采用Vue框架进行开发,后端使用SpringBoot框架搭建服务端应用。数据库采用MySQL进行数据存储和管理。整个系统通过前后端分离的方式实现,提高了系统的可维护性和可扩展性。同时,系统还采用了一些流行的技术和工具,如MyBatis、JPA等进行数据访问和操作,以及Maven进行项目管理和构建。 总之,本系统是一个基于SpringBoot开发的华府便利店信息管理系统,使用了Vue和MySQL作为前端框架和数据库。系统经过严格调试,确保可以运行。如果基础还行,可以在代码基础之上进行改动以实现更多功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值