两数之和 三数之和【基础算法精讲 01】

2023-09-21 14:42:58

灵神算法基础算法精讲[01] : 

两数之和 三数之和【基础算法精讲 01】_哔哩哔哩_bilibili

167.两数之和 II - 输入有序数组

链接 : 

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路 : 

  1. 采用双指针的思想,因为给出的数组是有序的,n  = len(numbers),定 l = 0,r = n-1;
  2. 如果s = numbers[l] + numbers[r]  > target , 那么s要变小,则r--;
  3. 如果s = numbers[l] + numbers[r]  < target , 那么s要变大,则l++;
  4. 如果s = numbers[l] + numbers[r]  = target , 那么就得到结果了,则返回[l+1,r+1]即可;

代码(python):

class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        l = 0
        r = len(numbers)-1
        while True:
            s = numbers[l] + numbers[r]
            if s==target:
                break
            if s>target:
                r -= 1
            else :
                l += 1
        return [l+1,r+1]

代码(c++):

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int l=0,r=numbers.size()-1;
        while(true){
            int s = numbers[l]+numbers[r];
            if(s==target) break;
            if(s>target) r--;
            else l++;
        }
        return {l+1,r+1};
    }
};

三数之和

链接 : 

三数之和

思路 :

假设满足条件的三个数的下标分别为i , j, k,且默认i<j<k;

先对数组进行排序,方便后面的操作

对i进行枚举,然后就是一个双指针的问题,令x=nums[i] , j=i+1 , k=n-1 ; 令 s = x + nums[j] + nums[k] , 剩下的就可以参考前一题中的思路:

1.如果s > 0  :  k--;

2.如果s<0  : j++

3.如果s=0 : 添加到结果中;

去重 : 分别对i,j,k去重;

优化 : 如果相邻的三数之和>0,那么就可以直接break了,因为后面的只会加大

如果nums[i]+nums[n-1]+nums[n-2]<0,那么就continue,因为这是以i为起点的情况下s的最大值,如果小于0,那么直接continue,跳到下一个 i 上;

代码( python ):

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        # 排序
        # i<j<k
        ans = []
        n = len(nums)
        for i in range(n-2):
            x = nums[i]
            if i>0 and x==nums[i-1]:# 对x去重
                continue
            if x+nums[i+1]+nums[i+2]>0: # 优化
                break
            if x+nums[-2]+nums[-1]<0: # 优化
                continue
            j = i + 1
            k = n - 1
            while j < k:
                s = x + nums[j] + nums[k]
                if s>0:
                    k -= 1
                elif s < 0:
                    j += 1 
                else:
                    ans.append([x,nums[j],nums[k]])
                    j += 1
                    while j<k and nums[j]==nums[j-1]:# 对j去重
                        j+=1
                    k-=1
                    while j<k and nums[k]==nums[k+1]:# 对k去重
                        k-=1
        return ans

代码( c++ ) : 

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
    int n = nums.size();
    vector<vector<int>> ans;
    sort(nums.begin(),nums.end());
    for(int i=0;i<n-2;i++)
    {
        int x = nums[i];
        if(x+nums[i+1]+nums[i+2] > 0) return ans;//如果三数和最小值大于0,那么直接返回
        if(x+nums[n-1]+nums[n-2]<0) continue;
        // 对a去重
        if(i>0 && nums[i] == nums[i-1]) continue;
        int left = i+1;
        int right = n-1;
        while(right>left)
        {
            int x = nums[i] + nums[left] + nums[right];
            if(x > 0) right--;
            else if(x < 0) left++;
            else 
            {
               ans.push_back(vector<int>{nums[i],nums[left],nums[right]});
               while(left<right && nums[right] == nums[right-1]) right--;
               while(left < right && nums[left] == nums[left+1]) left ++; 
               left++;
               right--;
            }
        }
    }
    return ans;
    }
};

更多推荐

shell脚本自动化执行jar包

需要用shell脚本来自动化执行jar包,以后可以用jenkins来CI/CD,记录一下对应实现。实现需求以命令行执行shell传入的第一个参数为jar名进行执行。对应jar已存在执行进程,关闭对应进程后再执行。以后台方式执行对应的jar包,输出log文件并判断是否成功执行。测试用jar包和功能为了保持进程执行不退出,

简单的分析下dart实现grpc客户端的流程,以helloworld为例

第三步:实现实现gRPC方法在HelloWorldClient类中,为每个定义在.proto文件中的rpc方法实现对应的Dart方法。简单的分析下dart实现grpc客户端的流程,以helloworld为例这里给出helloworld的proto文件,grpc协议下客户端和服务端都只需要关注相同的proto文件并以自己

JVM-环境准备&性能指标&基础知识

环境准备&性能指标&基础知识环境准备JDK—工具JDK(JavaDevelopmentKit)是用于开发Java应用程序的软件开发工具集合,包括了Java运行时的环境(JRE)、解释器(Java)、编译器(javac)、Java归档(jar)、文档生成器(Javadoc)等工具。简单的说我们要开发Java程序,就需要安

YOLOv8快速复现 训练 SCB-Dataset3-S 官网版本 ultralytics

目录0相关资料SCB-Dataset3-S数据训练yaml文件YOLOv8训练SCB-Dataset3-S相关参数0相关资料YOLOV8环境安装教程.:https://www.bilibili.com/video/BV1dG4y1c7dH/YOLOV8保姆级教学视频:https://www.bilibili.com/v

【R语言】完美解决devtools安装GitHub包失败的问题(以gwasglue为例)

Rstudio,R4.3.1,命令在Rstudio的命令行即console中运行。文章目录一、问题复述二、分析三、解决四、安装示例:gwasglue一、问题复述使用devtools安装一个github的包。devtools:devtools是R语言中一个非常有用的包,它提供了一套工具和函数,用于开发、测试和维护R包,d

Jenkins自动化部署前后端分离项目 (svn + Springboot + Vue + maven)有图详解

1.准备工作本文的前后端分离项目,技术框架是:Springboot+Vue+Maven+SVN+Redis+Mysql+Nginx+JDK所以首先需要安装以下:在腾讯云服务器OpenCLoudOS系统中安装jdk(有图详解)在腾讯云服务器OpenCLoudOS系统中安装mysql(有图详解)在腾讯云服务器OpenCLo

Fink--3、Flink运行时架构(并行度、算子链、任务槽、作业提交流程)

1、系统架构(以Standalone会话模式为例)1、作业管理器(JobManager)JobManager是一个Flink集群中任务管理和调度的核心,是控制应用执行的主进程。也就是说,每个应用都应该被唯一的JobManager所控制执行。JobManager又包含三个不同的组件(1)JobMasterJobMaste

性能测试、负载测试、压力测试、稳定性测试简单区分

是一个总称,可细分为性能测试、负载测试、压力测试、稳定性测试。性能测试以系统设计初期规划的性能指标为预期目标,对系统不断施加压力,验证系统在资源可接受范围内,是否能达到性能瓶颈。关键词提取理解有性能指标,验证性能测试目标验证系统的性能指标,是否为初期规划的预期目标客户指定相关性能指标,有性能相关要求,测试以这些指标为参

2022年贵州省职业院校技能大赛(高职组)“软件测试”赛项竞赛规程

2022年贵州省职业院校技能大赛(高职组)“软件测试”赛项竞赛规程一、赛项名称赛项名称:软件测试赛项组别:高职组赛项归属产业:电子信息二、竞赛目的(一)检验教学成效本赛项竞赛内容以《国家职业教育改革实施方案》为设计方针,以电子信息产业发展的人才需求为依据,以软件测试岗位真实工作过程为载体,全面检验高等职业院校人才培养方

由电阻电容采购引发的思考

BOM表,五花八门谁的锅,我的看法,设计原理图工程师的锅;成本太高,降成本谁的锅,设计工程师有一定责任,比如说22uf080525V就比同规格06031206等便宜采购物料品种怎么每次都不一样,维护成本高谁的锅,硬件主管的锅,没有维护好硬件库每次打板整理物料,核对物料那个痛苦啊!!!!!!自己做吧,太费时间!!!!!!

python+vue+elementui舞蹈教学视频评分系统_o4o1y

该系统从三个对象:由管理员、裁判员和用户来对系统进行设计构建。主要功能包括首页,个人中心,裁判员管理,用户管理,视频分类管理,健美操管理,评分管理,系统管理等功能进行管理。本系统在一般健美操评分系统的基础上增加了健美操资讯的功能,方便用户快速浏览,是一个高效的、动态的、交互友好的健美操评分系统。管理员端的功能主要是开放

热文推荐