【Hot100】LeetCode—15. 三数之和

目录

  • [1- 思路](#1- 思路)
    • [双指针法-三指针 定1+移动2](#双指针法-三指针 定1+移动2)
  • [2- 实现](#2- 实现)
    • [⭐15. 三数之和------题解思路](#⭐15. 三数之和——题解思路)
  • [3- ACM 实现](#3- ACM 实现)


1- 思路

双指针法-三指针 定1+移动2

  • 1- 先排序------>用于去重
  • 2- 遍历nums数组
    • 2.1 去重i:遇到 当 i 大于 0 时,ii-1 相等 continue
    • 2.2 定义 leftright 指针,利用 while 处理
    • 2.3 求和 sum,为三数和
    • 2.4 移动指针:如果 sum>0 移动 right,如果 sum<0 移动 left。否则 收集结果
    • 2.5 收集结果后去重 :leftright

2- 实现

⭐15. 三数之和------题解思路

java 复制代码
class Solution {

    List<List<Integer>> res = new ArrayList<>();
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);

        for(int i = 0 ; i < nums.length;i++){
            if(i>0 && nums[i-1] == nums[i]){
                continue;
            }

            int left = i+1;
            int right = nums.length-1;

            while(left<right){
                int sum = nums[i] + nums[left] + nums[right];
                if(sum>0){
                    right--;
                }else if(sum<0){
                    left++;
                }else{
                    res.add(new ArrayList<>(Arrays.asList(nums[i],nums[left],nums[right])));
                    // 去重 left 和 right
                    while(left<right && nums[left] == nums[left+1]) left++;
                    while(left<right && nums[right] == nums[right-1]) right--;
                    left++;
                    right--;
                }
            }
        }
        return res;
    }
}

3- ACM 实现

java 复制代码
public class threeSum {


    public static List<List<Integer>> res = new ArrayList<>();
    public static List<List<Integer>> threeSum1(int[] nums){
        Arrays.sort(nums);


        for(int i = 0 ; i < nums.length;i++){
            // 2.1去重i
            if(i>0 && nums[i]==nums[i-1]){
                continue;
            }

            //2.双指针
            int left = i+1;
            int right = nums.length-1;
            while (left<right){
                int sum = nums[i] + nums[left] + nums[right];
                if(sum>0){
                    right--;
                }else if(sum<0){
                    left++;
                }else{
                    res.add(new ArrayList<>(Arrays.asList(nums[i],nums[left],nums[right])));
                    while(left<right && nums[left] == nums[left+1]) left++;
                    while (left<right && nums[right-1] == nums[right]) right--;
                    left++;
                    right--;
                }
            }
        }
        return res;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入数组长度");
        int n = sc.nextInt();
        int[] nums = new int[n];
        for(int i = 0 ; i < n ;i++){
            nums[i] = sc.nextInt();
        }

        System.out.println("结果是"+threeSum1(nums).toString());
    }

}

相关推荐
B1acktion几秒前
2.3.插入排序——像打牌一样整理数组,为什么它对“几乎有序”数据特别友好?
数据结构·算法·排序算法
Mr_Xuhhh4 分钟前
C++算法刷题:排序子序列、削减整数、最长上升子序列(二)题解
开发语言·c++·算法
tankeven6 分钟前
HJ157 剪纸游戏
c++·算法
迈巴赫车主9 分钟前
蓝桥杯 19717 挖矿java
java·开发语言·数据结构·算法·职场和发展·蓝桥杯
airuike12314 分钟前
高性能MEMS IMU:机器人自主运动的核心感知中枢
人工智能·算法·机器人
郝学胜-神的一滴16 分钟前
PyTorch张量维度操控:transpose与permute深度拆解与实战指南
人工智能·pytorch·python·深度学习·算法·机器学习
未来之窗软件服务22 分钟前
SenseVoicecpp ggml-cann.cpp大模型[AI人工智能(七十六)]—东方仙盟
人工智能·算法·sensevoice·仙盟创梦ide·东方仙盟
Trouvaille ~37 分钟前
零基础入门 LangChain 与 LangGraph(一):理解大模型、提示词、Embedding 和接入方式
算法·langchain·大模型·embedding·rag·langgraph·llm应用
xiaoye-duck37 分钟前
《算法题讲解指南:动态规划算法--简单多状态dp问题》--17.买卖股票的最佳时机III,18.买卖股票的最佳时机IV
c++·算法·动态规划
老四啊laosi37 分钟前
[双指针] 5. 有效三角形的个数
算法·leetcode·有效三角形的个数