算法 三数之和-(双指针)

news/2024/7/23 10:58:06 标签: 三数之和, 双指针

牛客网: BM54

题目: 数组中所有不重复的满足三数之和等于0的数,非递减形式。

思路: 数组不小于3。不重复非递减,需先排序。使用idx从0开始遍历到n-2, 如果出现num[idx]==num[idx-1]的情况,忽略继续下一个idx;令left = idx+1, right = n-1,双指针迎面而行,如果满足num[left]+num[right]=-num[idx],则获取一个满足条件的解;为避免重复,分别对left、right一边检测一边移动,注意边界条件left+1<right;如果num[left]+num[right]>-num[idx],则right--;否则left++。

代码:

// go

package main

import "sort"

// import "fmt"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param num int整型一维数组
 * @return int整型二维数组
 */
func threeSum( num []int ) [][]int {
    // write code here
    if len(num) < 3 {
        return [][]int{}
    }
    sort.Ints(num)
    res := [][]int{}
    for idx := 0; idx < len(num) - 2; idx++ {
        if idx > 0 && num[idx] == num[idx-1] {
            continue
        }
        left := idx + 1
        right := len(num) - 1
        target := -num[idx]
        for left < right {
            if num[left] + num[right] == target {
                res = append(res, []int{num[idx], num[left], num[right]})
                for left + 1 < right && num[left] == num[left+1] {
                    left++
                }
                for right - 1 > right && num[right] == num[right-1] {
                    right--
                }
                left++
                right--
            } else if num[left] + num[right] > target {
                right--
            } else {
                left++
            }
        }
    }
    return res
}


http://www.niftyadmin.cn/n/5050751.html

相关文章

【已解决】node-gyp 安装报错

省流阅读 遇到问题node-gyp 安装报错&#xff0c;提示要安装vs&#xff0c;并开启Desktop development with C&#xff0c;但总是提示vs版本不对 最终解决方法如下&#xff1a; # 0 分析问题&#xff1a;当前npm版本为v14.16.0&#xff0c;适合python v2.7和VS2017&#xff0…

python设置全局代理

代理的种类&#xff1a; 代理分为http代理和socks代理&#xff01;&#xff01;&#xff01; python在设置代理的时候分两种情况&#xff0c; 第一种是只支持http代理、https代理的&#xff0c;那么就要写如下的代码在文件最前面&#xff1a; import osos.environ["ht…

51单片机自行车码表 速度里程计霍尔测速模拟电机设计

一、系统方案 本设计采用51单片机作为主控器&#xff0c;霍尔测速&#xff0c;数码管显示速度及里程数。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void init() { IT01; //INT0负跳变触发 TMOD0x01;//定时器工作于方式1 TH00x3c; //5…

设计模式——2. 工厂模式

1. 说明 工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的方式,而无需直接暴露对象的创建逻辑。工厂模式将对象的实例化过程封装在一个工厂类中,使客户端代码与具体对象的创建解耦,从而提高了代码的可维护性和灵活性。 工厂模式通常有以下几种变…

【Python】自动完成手写字体图片贴入以及盖章工具

简介 该工具完成了如下功能&#xff1a; 1.将文字转换为手写体填入到模板文件中 2.自动将文字转换为盖章格式填入到模板文件中 3.字体格式可以替换 4.有配置文件进行扩展功能 功能模块 1.界面模块 import sys from PyQt5.QtWidgets import QApplication, QMessageBox, QWid…

Linux内核启动流程-第二阶段start_kernel 函数

一. Linux内核启动 上一篇文章简单介绍了 Linux内核启动的第一阶段&#xff0c;即执行汇编流程。 本文简单了解一下&#xff0c;Linux内核启动的第二阶段&#xff1a;start_kernel函数&#xff0c;这是一个 C 函数。 本文续上一篇文章的学习&#xff0c;地址如下&#xff1a;…

springboot 捕获数据库唯一索引导致的异常

在一些业务场景中,需要保证数据的唯一性,一般情况下,我们会先到数据库中去查询是否存在,再去判断是否可以插入新的数据.如果是在高并发的情况下,可能还是会出现重复的情况.这时候可能就需要用到锁.也可以在数据库中设置唯一索引. 如果使用唯一索引,在插入相同数据的情况下会抛出…

【设计模式】四、工厂模式

文章目录 概述工厂模式简单工厂模式&#xff1a;工厂方法模式抽象工厂模式小结 概述工厂模式 传统方式&#xff1a; 简单工厂模式&#xff1a; 简单工厂模式的设计方案: 定义一个可以实例化 Pizaa 对象的类&#xff0c;封装创建对象的代码。 存在的问题&#xff1a; 简单工厂…