leecode-15 三数之和

NVIDIA Jetson之远程控制软件NoMachine安装使用 参考:https://www.bilibili.com/video/BV1cg4y1i776?t=12 0 背景 阅读详情

在这里插入图片描述

我的解法(不是完全解309/314)

  • 我的思路是定义一个left和一个right,然后在向集合里去查询,看看有没有除了nums[left],和nums[right]的第三个元素,把这个问题转换为一个遍历查找问题

    • 利用List.contains()方法来查找剩余元素
    • 利用List.remove和List.add(),来模拟派出了nums[left]和nums[right]的集合
  • 但是这种思路有个问题,就是时间复杂度太高了,我只通过了309/314的示例。

    • 其中这个ArrayList.contains 是 O(n),ArrayList.remove(Integer) 也是 O(n),然后外层有一个从left-length,有一个从length-left,循环接近O(n3),时间复杂度太高了
    • int left = 0,right =0;
      ArrayList<Integer> list = new ArrayList<>();
      for(int num:nums){
          list.add(num);
      }
      List<List<Integer>> result = new ArrayList<>();
      for(;left<nums.length-2;left++){
          list.remove(Integer.valueOf(nums[left]));
          List<Integer> temp = new ArrayList<>();
          int a =0;
          for(right=nums.length-1;right>left;right--){
              list.remove(Integer.valueOf(nums[right]));
              a = 0-nums[left]-nums[right];
              if(list.contains(a)){
                  Collections.addAll(temp,nums[left],nums[right],a);
                  List<Integer> temp2 = new ArrayList<>(temp);
                  Collections.sort(temp2);
                  if(!result.contains(temp2)){
                      result.add(temp2);
                  }
                  temp.clear();
              }
              list.add(nums[right]);
          }
      }
      return result;
      
  • 改进1:对于这个代码我们需要想办法减少它的时间复杂度,为了遍历出所有情况,内外两层循环遍历是不能够改变的。所以我们可以想办法去减少这个查找的时间复杂度,将这个集合转换为哈希集合,这样查询的时间复杂度就变成了O(1)了

    • 但是很遗憾,这个时间复杂度还是高了,还需要继续降时间复杂度
    • List<List<Integer>> result = new ArrayList<>();
      // 用 HashMap 统计每个数字的出现次数(替代 ArrayList)
      Map<Integer, Integer> count = new HashMap<>();
      for (int num : nums) {
          count.put(num, count.getOrDefault(num, 0) + 1);
      }
      // 为了去重,排序后按顺序枚举
      int n = nums.length;
      for (int i = 0; i < n - 2; i++) {
          int left = nums[i];
          count.put(left, count.get(left) - 1); // 用掉一个 left
          for (int j = n-1; j >i; j--) {
              int right = nums[j];
              count.put(right, count.get(right) - 1); // 用掉一个 right
              int target = 0 - left - right;
              // 检查剩余集合中是否有 target
              if (count.getOrDefault(target, 0) > 0) {
                  List<Integer> list = Arrays.asList(left, right, target);
                  Collections.sort(list); // 排序以确保结果的唯一性
                  if (!result.contains(list)) {
                      result.add(list);
                  }
              }
              // 把 right 加回来,供下一轮使用
              count.put(right, count.get(right) + 1);
          }
      }
      return result;
      

灵神的思路

  • 灵神在讲这个题的时候先参考了这个 📄((20250730131645-jdjxatg ‘0167 两数之和II-输入有序数组’)) 这个题
    如果是两个数的话,我们就可以使用两个指针进行快速的寻找
    所以我们想想办法,看怎么使这个三个数的和变成两个数

  • 我们可以通过先对这个数组进行排序,这样就和0167题具有了相同的初始条件,即数组有序
    之后我们对这个数组进行遍历,先确定一个数,之后再剩余的数组中,找到两个数的和为0-这个数,此时就和0167题相似了。

  • 有一个点,不太容易理解,就是为什么left是从i+1开始,而不是从别的地方开始
    是因为,每次遍历的时候,都会把这个位置的所有情况给考虑到,后续的其它集合就不会包含这个元素

    //讲数组进行排序
    Arrays.sort(nums);
    int n = nums.length;
    List<List<Integer>> ans = new ArrayList<>();
    for( int i= 0; i<n-2;i++){
        if(i>0&&nums[i]==nums[i-1]){
            continue;//代表这个重复了
        }
        int left = i+1;
        int right= n-1;
        int target = 0 - nums[i];
        while(left<right){
            if(nums[left]+nums[right]>target){
                right--;
            }else if(nums[left]+nums[right]<target){
                left++;
            }else {
                ans.add(Arrays.asList(nums[i], nums[left], nums[right]));
                //之后的话进行下一轮,因为可能还有重复,我们将left和right修改
                //比如[-2,-2,-2,-2,4,4,4,4,4],这个地方就有可能重复
                left++;
                while(left<right&&nums[left]==nums[left-1]){
                    left++;
                }
                right--;
                while(left<right&&nums[right]==nums[right+1]) {
                    right--;
                }
            }
        }
    }
    return ans;
    
  • 如何剪枝
    当我们确定了第一个数,发现它和这个排序后的数组中最大的两个数相加都小于0的话,那么这个都不用看了,不可能会有等于0的情况,我们此时切换到下一个数
    当我们确定了第一个数,如果它和它紧挨着的两个数(靠近它最小的数)相加大于0,那么后续都会大于0,直接跳过

  • if(nums[i]+nums[i+1]+nums[i+2]>0){
        break;
    }
    if(nums[i]+nums[n-1]+nums[n-2]<0){
        continue;
    }
    
【Codecs系列】x265编码器(十二):子像素运动搜索 在基于块运动补偿的视频编码框架中,运动搜索是最为重要的环节之一,同时也是编码端最为耗时的模块。运动搜索包括整像素运动搜索和子像素运动搜索,其中整像素运动搜索已经有很多快速算法,比如经典的三步搜索法、菱形搜索、六边形搜索以及TZSearch等等;但子像素搜索的快速算法却比较少,本文主要讲解x265编码器中的子像素搜索方法以及相关的快速搜索方法。 阅读详情

相关推荐

STM32F407硬件IIC驱动OLED避坑实录:从‘不显示’到‘稳定刷屏’的完整调试过程

本文详细记录了使用STM32F407硬件IIC驱动OLED屏幕的完整调试过程,从初始的‘不显示’问题到最终实现‘稳定刷屏’。文章涵盖了硬件接线、I2C外设配置、常见问题排查及性能优化技巧,特别针对STM32标准库开发中的难点提供了实用解决方案,是嵌入式开发者驱动OLED屏幕的实用指南。

weixin_30315723的博客 303

leecode15——三数之和

n数之和

wish9968的博客 260

DDR内存Prefetch机制详解:从DDR1到DDR4的技术演进与性能提升

本文深入解析DDR内存Prefetch机制从DDR1到DDR4的技术演进与性能提升。通过分析Prefetch技术的实现原理与Burst传输的协同机制,揭示DDR1的2n Prefetch、DDR2的4n Prefetch、DDR3的8n Prefetch以及DDR4的Bank Group架构创新如何显著提升内存带宽与系统性能。

weixin_30369041的博客 537

Leecode15——三数之和(双指针)

1.这个题初看是有点像两数之和的,不过是把两次循环升维到了三层循环;2.降低三层循环复杂度的办法,如这里的双指针、哈希表等(不知道这里能不能用哈希表)优化;3.双指针的动作方式需要巧妙设计,引入人为的判断能加速算法;4.有的时候,对数组适当的预处理(排序、去重)也很重要,能简化算法逻辑。

qq_53507133的博客 1032

配置权重_高盛都在用的资产配置模型,BL贝叶斯框架改进Markowitz

前面我们说到,markoviz的均值-方差模型,第一次,用数学的方式严格证明了投资组合存在最优的权重,但它的学术意义大于实战。主要原因有两个:1,人们很难有效的预测期望收益率;2,最优资产组合配置对输入非常敏感,结果往往难以被人理解。还有就是在投资中,定量只是完成初步构建,同步的定性判断依然非常重要:第一,投资者的认知偏好:倾向于关注他们认为被低估,但有发展潜力或者可以确定相对交易价值的小部分股票...

weixin_39892309的博客 715

跟着Synopsys报告,一步步拆解车规芯片FMEDA计算(含公式与避坑点)

本文详细解析了车规芯片FMEDA计算的全流程,基于Synopsys报告拆解实战指南,涵盖基础失效率建模、安全机制效能评估及安全指标合成等关键步骤。通过公式解析、数据准备清单和避坑点分享,帮助工程师掌握ISO26262标准下的硬件量化分析技术,提升车载系统设计可靠性。

weixin_30460489的博客 195

Leecode 15三数之和

内层的while循环中,循环条件为 left < right,同样的,我们也需要对left 和 right 进行去重,那么如何去重呢,是进入循环时直接去重,还是找到一个三元组以后再去重呢?考虑一个刚开始便是[0,0,0]的三元组,若是再while循环刚开始对它进行去重的话,会导致left >= right ,从而漏过了这种情况,所以我们需要在找到一个三元组后,再进行去重。用双指针法,for循环中 , left = i+1,right = nums.size() -1;Leecode 15 .三数之和。

Stanly_的博客 322

使用libx265对YUV进行h265编码

使用libx265对YUV进行h265编码

Embedded engineer 3078

leecode 15.三数之和

这个题目一拿到手我的想法是把这些数字分成正数和负数,因为如果要得到sum = 0的话,一定要有一个负数,但是这样的话忽略了3个0的情况,因此没有全部通过,而且如果负数正数这么搜索的话,一正一负拿完,如果有重复数字需要重复利用,会导致输出的三元组存在重复的情况,因此需要去重,这个思路的代码是思路1代码。正常的思路应该是先把数组升序排列,用一个指针遍历数组,再在遍历的时候用双指针从两头向中间逼近,筛出剩余数据。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。

qq_35085273的博客 1494

Python爬虫:如何抓取亚马逊商品评论和评分

通过本文的学习,您已经掌握了如何使用Selenium爬取亚马逊商品的评论数据,并处理反爬虫机制。特别是在亚马逊这样的大型电商平台,商品评论和评分不仅能够反映产品的质量和顾客的体验,还可以对商家进行竞争分析。通过爬取亚马逊的商品评论,您可以获得有价值的市场信息,如产品的优缺点、消费者的反馈等。通过查看源代码,您可以发现,亚马逊的商品评论和评分数据往往通过JavaScript动态加载,这也意味着在抓取时需要使用Selenium或Playwright等工具来模拟浏览器加载。亚马逊的评论页面支持分页加载。

2201_76125261的博客 1437

基于STM32L4XX 、HAL库的TMC2209-LA-T步进电机驱动器驱动程序应用设计

/ R/W=0 表示写。uint32_t gconf_value = (0 << 0) // I_scale_analog: 禁用,使用UART控制电流。uint32_t ihold_irun = (8 << 0) // 保持电流 8/31 最大值。

PP_Cottage的博客 449

LeeCode15.三数之和C++实现

两数之和 三数之和【基础算法精讲 01】答案中不可以包含重复的三元组。,判断是否存在三元组。

hetupyou的博客 394

如何合理评估信号过孔的残桩效应--Via Stub

设计中,之所以会去考察信号过孔的残桩效应(Via Stub),是因为它的存在导致了不需要的频率谐振,当这些谐振出现在所关注的信号通道的插入损耗中时,就会引发较为严重的信号完整性(SI)问题,那么Via Stub到底是如何引发SI问题的呢?

一只豌豆象的博客 4464

leecode 15. 三数之和

15. 三数之和 本题用排序+双指针比较容易理解解决,先进行排序,然后for遍历数组,在遍历过程中使用左右指针对一些细节判断。下面的答案提交后效率不高,可能是用来HashSet的原因,时间复杂度更高了。 class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); List<List<Integer

maocaicai的博客 744

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LeeCode15三数之和(Java)(双指针)

题目链接:LeeCode15三数之和 题目描述: 双指针问题,先排序,对于每一个数据将指针定在左边和右边,根据返回结果的跟零对比的大小判断将右指针左移(结果变小)还是将左指针右移(结果变大),每次找到答案集的时候将指针向中间靠拢(排除重复结果),找有没有别的解可以满足要求 class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); L

weixin_43590593的博客 215

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Leecode刷题笔记——15. 三数之和

题目要求:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例: 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 思路如下 1...

Tyxxxxxx 284

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

leecode15题三数之和

虽然,这样的写法最后没有通过测试,但是可以一起复习组合问题和全排列问题,同时能意识到组合问题和排列问题,只能通过回溯法求解,正如卡哥说的:“因为没得选,一些问题能暴力搜出来就不错了,撑死了再剪枝一下,还没有更高效的解法。但写出来发现,这是要选用三个数,因此得用三层for循环,时间复杂度会变得十分高,如果是面试现场,我想面试官不会想看到这样的答案。之前一直搞不懂,现在可以这样理解:递归就是“递”和“归”,在递的时候其实就是+i,返回这个函数调用点的时候就是回溯“归”了。灵神的讲的不错,还没有悟透,先水水。

m0_58321258的博客 541

Leecode-15 三数之和

题目要求: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/3sum 示例: 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 思路: 一 很明显,

Kingsley's Blog 220

leecode面试 Middle Top15 三数之和

三数之和 package com.zhien.leecodeface.middle; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @author Zhien * @create 2021-04-13-0:47 * 三数之和 * 给你一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c , * 使得a + b + c = 0 ?请你找出所有和为 0 且

weixin_45309710的博客 167

LeeCode数组第15题三数之和

题目:三数之和 内容: 给定一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,使得a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-...

weixin_30535167的博客 162

Leecode 15.题:三数之和

Leecode 15.题:三数之和

StackOverFLow 421

Leecode15 三数之和

去重要注意

qq_42569994的博客 191

leecode(15)三数之和

2.2.1 题目说明 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例: 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 尝试:第一种暴力法 public List<List<Integer>> threeSum1(i

zhao_programmer的博客 228

python leecode 15 双指针三数之和

python leecode 15题目描述双指针 题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 链接:https://leetcode-cn.com/problems/3sum 双指针 有个测试样例在[0,0,0]卡了很久 发现首元...

clearlove_7的博客 230

LeeCode热题100学习总结--15题三数之和

文章摘要:该算法通过排序数组后使用双指针法高效找出所有不重复的三元组,使其和为0。关键步骤包括:1)排序数组;2)固定最小数nums[i];3)用双指针在剩余区间寻找两数之和等于-nums[i];4)通过跳过重复值实现去重。时间复杂度为O(n²),空间复杂度为O(1)。算法巧妙利用排序和指针移动时的去重处理,避免了结果集的重复检查。

i56433u的博客 822

LeeCode15_三数之和

题目描述 给一个数组nums,判断是否存在三个元素a,b,c满足 a+b+c =0,找出所有和为0且不重复的三元组。 思路: 1、如果nums的长度小于3,直接返回; 2、先从小到大排序,如果第一个数大于0 或者最后一个数小于0 那么一定不存在这样的三个元素。 3、这里面的难点是去重 function threeSum(nums){ let len = nums.length; if(len < 3) return [];

lucky_ferry的博客 247
上一篇: leecodde-0128 最长连续序列
下一篇: leecode-167 两数之和II-输入有序数组
TranquilGlow
博客等级 码龄5年 132粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值