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

【LeetCode100】--- 6.三叔之和【思维导图---复习回顾】

题目传送门

方法一:使用双指针+排序

先排重num【i】版本

由于当前还没有计算过 nums[i] 
如nums【-4,-1,-1,0,1,2】
若直接排重就会错过如 [-1,-1,2] 这样的结果。
因此当前排重只需要

if(i > 0 && nums[i] == nums[i-1]){continue;
}

这样就不会错过
如 [-1,-1,2] 这样的结果。因为前置判断后会计算(重复元素的前列)
当num[i] 等于第一个 -1 的结果

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ret = new ArrayList<>();int n = nums.length;Arrays.sort(nums);for(int i = 0; i < n; i++){if(nums[i] > 0)break;if(i > 0 && nums[i] == nums[i-1]){continue;}int target = -nums[i];int left = i + 1;int right = n-1;while(left < right){if(nums[left] + nums[right] == target){ret.add(Arrays.asList(nums[i],nums[left],nums[right]));while(left < right && nums[left] == nums[left+1] ) {left++;}while(left < right && nums[right] == nums[right-1]){right--;}left++;right--;}else if(nums[left] + nums[right] < target){left++;}else{right--;}}}return ret;}
}

算法思维导图 

后排重nums【i】版本

如nums【-4,-1,-1,0,1,2】
由于此时已经把当前 num[i] (重复元素的前列)计算过了
此时就已经加上如 [-1,-1,2] 这样的结果
因此直接while循环排重 num[i] 最后由于for循环还有i++
成功排重 nums【i】

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ret = new ArrayList<>();int n = nums.length;Arrays.sort(nums);for(int i = 0; i < n; i++){if(nums[i] > 0)break;int target = -nums[i];int left = i + 1;int right = n-1;while(left < right){if(nums[left] + nums[right] == target){ret.add(Arrays.asList(nums[i],nums[left],nums[right]));while(left < right && nums[left] == nums[left+1] ) {left++;}while(left < right && nums[right] == nums[right-1]){right--;}left++;right--;}else if(nums[left] + nums[right] < target){left++;}else{right--;}}while(i < n-3 && nums[i] == nums[i+1]){i++;}}return ret;}
}

算法思维导图

复杂度分析: 

时间复杂度:O(n log n)

  • 排序:O(n log n)
  • 外层循环 + 双指针扫描:O(n) × O(n) = O(n²)
     

空间复杂度(O(log n)

该算法的空间复杂度为 O(log n),主要来源于排序过程中的递归调用栈空间。结果列表的空间通常不计入复杂度,因为它取决于输入的具体情况(解的数量),而非算法本身的实现。

http://www.dtcms.com/a/277931.html

相关文章:

  • 基于Java日志平台的访问链路追踪实战
  • JAVA并发——synchronized的实现原理
  • C#特性:从元数据到框架基石的深度解析
  • 强化学习初探及OREAL实践
  • Word中的批注显示与修订显示
  • 【vs2022】 error C2338: Unicode support requires compiling with /utf-8
  • 时间的弧线,逻辑的航道——标准单元延迟(cell delay)的根与源
  • [附源码+数据库+毕业论文+答辩PPT+部署教程+配套软件]基于SpringBoot+MyBatis+MySQL+Maven+Vue实现的交流互动管理系统
  • 基于Springboot+UniApp+Ai实现模拟面试小工具四:后端项目基础框架搭建下
  • 长上下文能力:FlashAttention vs. RingAttention
  • 协程的 callbackFlow 函数的使用和原理
  • 认识数据分析
  • 第一,二次作业
  • LAN-401 linux操作系统的移植
  • DHS及HTTPS工作过程
  • 【Claude Code】 AI 编程指南
  • sql初学见解
  • 多线程死锁
  • 飞算Java AI开发助手:引领智能编程新风尚
  • Llama系列:Llama1, Llama2,Llama3内容概述
  • 【读书笔记】《C++ Software Design》第九章:The Decorator Design Pattern
  • HTML 基本骨架
  • [GWCTF 2019]我有一个数据库
  • SOMEIP协议与测试
  • LeetCode 2401.最长优雅子数组
  • C++数组指针与函数指针
  • 为什么要有延时回调?
  • 2024-2025-2 山东大学《软件工程与实践》期末(回忆版)
  • p4 大小写检查
  • C++高级编程,类模版成员函数类外实现