首页 > 其他分享 >三数之和(双指针法)

三数之和(双指针法)

时间:2024-08-04 10:05:56浏览次数:7  
标签:right nums 三数 list add 指针 left

题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

双指针法:首先我们要对数组进行排序,我们开始遍历数组从0下标开始记为i,定义left指针为i+1,right指针为nums.length-1(最后一位),然后开始收集结果,如果我们的nums[i]+nums[left]+nums[right]<0则left指针右移一位,如果我们的nums[i]+nums[left]+nums[right]>0则right指针左移一位,如果等于0则加入结果集中,但是这里有很多去重的细节,我们看以下代码中的解法。

import java.util.*;
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int left;
        int right;
        Arrays.sort(nums);
        List<List<Integer>> result=new ArrayList<>();
        
        for(int i=0;i<nums.length-2;i++){
            if(nums[i]>0){
                return result;
            }
			//如果和前一位相同的话我们再遍历数组就会有重复的结果集,我们直接跳过进入下一次循环
            if(i>0 && nums[i]==nums[i-1] ){
                continue;
            }
            left=i+1;
            right=nums.length-1;
            while(left<right){
                if(nums[i]+nums[left]+nums[right]<0){
                    left++;
                }else if(nums[i]+nums[left]+nums[right]>0){
                    right--;
                }else{
                    List<Integer> list=new ArrayList<>();
                    list.add(nums[i]);
                    list.add(nums[left]);
                    list.add(nums[right]);
                    result.add(list);
                    //这一步操作看下图错误实例,这一步也是结果集去重的关键
                    while (right > left && nums[right] == nums[right - 1]) {
                        right--;
                    }
                    while (right > left && nums[left] == nums[left + 1]) {
                        left++;
                    }
                    left++;
                    right--;
                }
            }
        }
        return result;
    }
}

标签:right,nums,三数,list,add,指针,left
From: https://www.cnblogs.com/dfj-blog/p/18341491

相关文章

  • 深圳大学-电信院-C程序设计实验-指针编程
    实验目的一、了解并掌握使用指针进行编程的方法;二、了解并掌握指针作为函数参数时函数的编写与调用方法。实验要求本次实验不要求提交正式实验报告,但要求实验完成后,将程序及程序的运行结果依次拷贝到一个word文档中,统一形成一个.doc文档后提交至Blackboard。文档名可用......
  • C ——— 指针笔试题(最终篇)
    指针加减整数和解引用的笔试题boss题:char*c[]={"ENTER","NEW","POINT","FIRST"};char**cp[]={c+3,c+2,c+1,c};char***cpp=cp;printf("%s\n",**++cpp);printf("%s\n",*--*++cpp+3);printf(&......
  • C++学习笔记之指针高阶
    数组名数组名字是数组的首元素地址。一个指针变量保存了数组元素的地址。我们就称之为数组元素指针,及数组指针。数组指针的本质是指针,指向数组中的某个元素的地址。 由于数组名可以代表数组收元素地址,数组元素是可以通过 数组名[下标]的格式访问,那么可以定义一个指针......
  • C语言指针与数组
    在上一篇对指针介绍的文章当中,我们初次了解到了指针,并且知道了地址和内存间的关系,懂得了如何取地址和对指针的解引用,算是对指针有了一个初步的了解。而今天让我们对指针进行更深一步的了解吧~一、指针与数组名我们知道,指针变量是一个用来存放地址的变量,比如我们定义一个整形......
  • 函数指针和指针函数的使用
    指针函数1:本质函数,返回值为指针1.2:格式:数据数据*函数名(形参){函数体return地址;//失败一般会返回NULL}#include<stdio.h>#include<stdlib.h>char*yue(){//chara[32]="hello";//栈区,函数调用结束后空间被释放//char*s="hello";//常量区,不会被释......
  • 【C++】引用和指针的不同点
    引用和指针的不同点:(从使用的角度去对比,按自己的理解的角度去梳理,硬记很难记全,虽然不赢记大概率也记不全)1.引用概念上定义一个变量的别名,指针存储一个变量地址。2.引用在定义时必须初始化,指针没有要求。3.引用在初始化时引用一个实体后,就不能再引用其他实体;而指针可以在......
  • c语言中的地址与指针的概念,及变量的指针和指向变量的指针变量
    C语言中的地址、指针、以及变量的指针与指向变量的指针变量。1.地址(Address)在C语言中,每个变量在内存中都有一个唯一的内存地址。这个地址是变量存储的位置的标识符。可以通过& 运算符来获取一个变量的地址。#include<stdio.h>intmain(){  intx=10;  ......
  • c语言结构体的概述,定义结构体变量类型的方法,结构体变量的引用,结构体变量的初始化,结构
    1.C语言结构体的概述在C语言中,结构体(struct)是一种复合数据类型,用于将不同类型的数据组合在一起。它可以包含基本数据类型(如int、float、char等)以及其他结构体。结构体非常适合表示具有多种属性的复杂数据,如学生信息(包含姓名、年龄、成绩等)或坐标点(包含x和y坐标)。结构......
  • java如何避免NullPointerException(空指针异常,NPE)
    本文将简单的介绍nep以及如何避免npe1.npe简介空指针异常(NullPointerException)意思是指java中的异常类。当应用程序试图在需要对象的地方使用null时,抛出该异常。这种情况包括:调用null对象的实例方法。访问或修改null对象的字段。将null作为一个数组,获得其长度......
  • 嵌入式控制器(STM32)->栈指针累寄存器
    全局变量和局部变量从存储角度理解全局变量具有固定的地址,每次读写都是一个地址,而且它的存储区域从使用到使用结束一直存在局部变量再RAM中的地址不固定,采用先进后出的RAM区域,称为栈区寄存器分为通用寄存器(R0-R12)和特殊寄存器(R13-R15)ARM基本指令系统数据传送,数据操作,跳......