你今天学算法了吗?打卡第三天

 


目录

 一、题目

1、题目描述

2、基础框架

3、原题链接

二、解题报告

1、思路分析

2、时间复杂度

3、代码详解

三、本题小知识


 一、题目


1、题目描述

  

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:

输入:nums = []
输出:[]
示例 3:

输入:nums = [0]
输出:[]

提示:

  • 0 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

2、基础框架

   Java 版本给出的基础框架代码如下:   

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
}

3、原题链接

    LeetCode 15. 三数之和

二、解题报告


1、思路分析

先排序,三数之和有三种情况,大于0,小于0,等于0,

等于0,则添加到我们的集合中,

小于0,则增大和,再和0比较

大于0,则减小和,再和0比较


2、时间复杂度

缺,后补!!!!!!!!!!!


3、代码详解

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
       //排序数组
       Arrays.sort(nums);
       int n = nums.length;
        //存储结果的集合
       List<List<Integer>>res = new ArrayList<>();
       int sum = 0;
        //遍历枚举
       for(int i=0;i<n-2;i++){
           //双指针
           int left=i+1,right=n-1;
           while(left<right){
               sum = nums[i]+nums[left]+nums[right];
                //相等则把这三个元素放入集合list中
               if(sum==0){
                   List<Integer>list = new ArrayList<>();
                   list.add(nums[i]);
                   list.add(nums[left]]);
                   list.add(nums[right]);
                    //检差res中是否存在list,不存在则添加
                   if(!res.contains(list)){
                       res.add(list);
                   }
                   //指针偏移
                   left++;
                   right--;
                //若和大于0,则把right左移
               }else if(sum>0){
                   right--;
                //和小于0,则把left右移
               }else{
                   left++;
               }
           }
       }
       return res;
    }
}

三、本题小知识

    三数之和,枚举;

猜你喜欢

转载自blog.csdn.net/qq_43846797/article/details/124288077