当前位置: 首页 > news >正文

力扣最热一百题——6.三数之和

目录

题目链接:15. 三数之和 - 力扣(LeetCode)

题目描述

示例

提示

解法一:双指针

代码分析

总结


        没啥多说的,就是最近CS根本上不了分谢谢。


题目链接:15. 三数之和 - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

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

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

示例

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示

  • 3 <= nums.length <= 3000
  • -10^5 <= nums[i] <= 10^5

解法一:双指针

  1. 排序

    • 首先,将数组 nums 进行排序。这是因为排序可以简化处理逻辑,使得我们可以使用双指针技术来高效地找到三数之和为零的组合。
  2. 遍历和去重

    • 使用一个 for 循环遍历数组 nums。对于每个元素 nums[i],我们尝试找到另外两个元素 nums[left]nums[right],使得它们的和与 nums[i] 的和为零。
    • 在遍历时,首先检查当前元素 nums[i] 是否大于零。如果 nums[i] 大于零,则直接返回结果,因为后面的所有元素也都大于零,不可能再找到和为零的三元组。
    • 为了避免重复的三元组,使用一个去重机制。如果当前元素与前一个元素相同,跳过当前元素。
  3. 双指针查找

    • 初始化两个指针 leftright,分别指向 i 之后的第一个元素和数组的最后一个元素。
    • 进入 while 循环,通过移动 leftright 指针来寻找满足条件的三元组。
      • 如果 nums[i] + nums[left] + nums[right] 大于零,则 right 向左移动以减少总和。
      • 如果小于零,则 left 向右移动以增加总和。
      • 如果等于零,则找到了一个满足条件的三元组,将其加入结果列表中。
  4. 处理重复元素

    • 在找到一个有效三元组后,为了避免结果中出现重复的三元组,需要对 leftright 指针所指向的元素进行去重处理。
    • 移动 left 指针,跳过所有与下一个元素相同的值。
    • 移动 right 指针,跳过所有与上一个元素相同的值。
  5. 返回结果

    • 最终返回存储所有三元组的 result 列表。

代码分析

  • 时间复杂度O(n^2)。排序的时间复杂度是 O(n log n),而双指针查找的时间复杂度是 O(n^2),因为每次内层 while 循环最多遍历整个数组。

  • 空间复杂度O(1)(不包括返回结果空间)。算法只使用了固定数量的额外空间来存储指针和变量。

class Solution {public List<List<Integer>> threeSum(int[] nums) {//创建需要返回的集合ArrayList<List<Integer>> result = new ArrayList<>();//将数组nums进行排序Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {//排序之后如果第一个数已经大于0,则已经不可能使和为0if (nums[i] > 0){return result;}//防止重复元素加入,现在进行去重操作if (i > 0 && nums[i] == nums[i - 1]){//发现为重复元素,跳过这次循环continue;}//定义left和right两个指针int left = i + 1;int right = nums.length - 1;//开始查找合适的集合元素while ( left < right){if (nums[i] + nums[left] + nums[right] > 0){//大于0,right左移\right--;}else if (nums[i] + nums[left] + nums[right] < 0){//小于0,left右移\left++;}else {//获得正确目标,将目标加入result集合result.add(Arrays.asList(nums[i] , nums[left] , nums[right] ));//同时在加入之后防止找到重复的目标,进行while中的去重操作while (left < right && nums[left] == nums[left + 1]){//left重复,将left右移left++;}while (left < right && nums[right] == nums[right - 1]){//right重复,将right左移right--;}//去重操作完毕,将继续while遍历,寻找目标值,移动left和rightleft++;right--;}}}return result;}
}

总结

        多多熟悉就好啦!!!今天也开学了,我也刚发布了一篇图像识别的文章,大家多多支持谢谢!!!!!

链接如下:实时图形识别的实现:模板匹配与几何特征方法的对比-CSDN博客

感谢大家的支持!!!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue part4
  • HashMap源码剖析
  • 什么原因会导致websocket断连
  • 科学做系统设计 监测解技术危机
  • freemarker模版注入
  • 锂电池规格 —— 参数解读
  • 【IAR】IAR中使用内联函数
  • Linux系统中的HTTP协议
  • 医疗信息化系统:HIS、LIS、EMR、PACS、RIS等系统概览
  • 盘点16款仓库管理系统,助力企业选型!
  • dubbo:dubbo+nacos整合springcloud gateway实现网关(三)
  • 应用商场的搭建
  • Git Submodule 常用命令详解
  • FastGPT如何增减用户
  • React项目-less、antd配置
  • 《深入 React 技术栈》
  • angular2开源库收集
  • chrome扩展demo1-小时钟
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • C学习-枚举(九)
  • JSDuck 与 AngularJS 融合技巧
  • Laravel5.4 Queues队列学习
  • Spring框架之我见(三)——IOC、AOP
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 大主子表关联的性能优化方法
  • 山寨一个 Promise
  • 使用SAX解析XML
  • 小程序button引导用户授权
  • zabbix3.2监控linux磁盘IO
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • (7)摄像机和云台
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (Python第六天)文件处理
  • (附源码)php投票系统 毕业设计 121500
  • (十八)SpringBoot之发送QQ邮件
  • (四)c52学习之旅-流水LED灯
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)可以带来幸福的一本书
  • (转)平衡树
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .Net转前端开发-启航篇,如何定制博客园主题
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @Async注解的坑,小心
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [04]Web前端进阶—JS伪数组
  • [17]JAVAEE-HTTP协议
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [AI Google] 使用 Gemini 取得更多成就:试用 1.5 Pro 和更多智能功能
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [C#] 我的log4net使用手册
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [C++进阶篇]STL中vector的使用
  • [ComfyUI]Flux+MiniCPM-V强强联手艺术创意,媲美GPT4V级国产多模态视觉大模型
  • [CR]厚云填补_SEGDNet