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

LeetCode刷题 day10

目录

  • 1.最接近的三数之和
  • 2.四数之和

1.最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个在 不同下标位置 的整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。

示例 1:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2)。

示例 2:
输入:nums = [0,0,0], target = 1
输出:0
解释:与 target 最接近的和是 0(0 + 0 + 0 = 0)。

思路
排序+双指针:排序时间复杂度为O(nlogn),双指针遍历O(n),因此整体时间复杂度是O(nlogn),如果是暴力解法是O(n^2),因此优于暴力算法

classSolution{publicintthreeSumClosest(int[]nums,inttarget){Arrays.sort(nums);intminSum=1_00_0001;intn=nums.length;for(inti=0;i<n-2;i++){//判断左边界//这里加了优化,如果最左边三个元素和大于target,则后续不用遍历,因为根据数组有序性,其他元素和更是大于target,取当前最小值即可intcurSum=nums[i]+nums[i+1]+nums[i+2];if(curSum>target){minSum=Math.abs(target-curSum)<Math.abs(minSum-target)?curSum:minSum;continue;}//判断右边界//分析同上curSum=nums[i]+nums[n-1]+nums[n-2];if(curSum<target){minSum=Math.abs(target-curSum)<Math.abs(minSum-target)?curSum:minSum;continue;}curSum=nums[i]+nums[i+1]+nums[i+2];intj=i+1,k=n-1;curSum=nums[i]+nums[j]+nums[k];while(j<k){minSum=Math.abs(target-curSum)<Math.abs(minSum-target)?curSum:minSum;if(curSum>target){curSum-=nums[k];k--;curSum+=nums[k];}else{curSum-=nums[j];j++;curSum+=nums[j];}}}returnminSum;}}

时间复杂度:O ( n log ⁡ n ) O(n \log n)O(nlogn)
空间复杂度:O ( 1 ) O(1)O(1)

2.四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

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

示例 2:
输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

思路
同上一题思路一样,排序加双指针,暴力解法是四层遍历,时间复杂度为O(n4),而双指针时间复杂度为O(n3)

classSolution{publicList<List<Integer>>fourSum(int[]nums,inttarget){//先排序Arrays.sort(nums);List<List<Integer>>ans=newArrayList<>();intn=nums.length;for(inti=0;i<n-3;i++){//这里有小优化,判断当前是否与前一个循环的元素相同,保持每个四元组只有一个if(i>0&&nums[i]==nums[i-1]){continue;}for(intj=i+1;j<n-2;j++){//这里同样的优化,目的也是为了保证四元组的唯一性if(j>i+1&&nums[j]==nums[j-1]){continue;}longremains=(long)target-nums[i]-nums[j];if(nums[j+1]+nums[j+2]>remains||nums[n-2]+nums[n-1]<remains){continue;}for(intk=j+1,l=n-1;k<l;){intsum=nums[k]+nums[l];if(sum==remains){List<Integer>list=List.of(nums[i],nums[j],nums[k],nums[l]);ans.add(list);k++;while(k<l&&nums[k]==nums[k-1]){k++;}l--;while(k<l&&nums[l]==nums[l+1]){l--;}}elseif(sum<remains){k++;}else{l--;}}}}returnans;}}

时间复杂度:O ( n 3 ) O(n^3)O(n3)
空间复杂度:O ( 1 ) O(1)O(1)

http://www.jsqmd.com/news/647297/

相关文章:

  • ONNX模型转换实战:从PyTorch到TensorRT的完整优化指南
  • Ubuntu 20.04离线环境下的NFS服务部署与配置指南
  • OpenHarmony-L2开发全流程实战指南:从源码到应用部署
  • Git冷命令拯救崩溃现场:从灾难到重生的终极指南
  • 【生成式AI架构设计黄金法则】:20年架构师亲授5大避坑指南与3套可落地的高可用方案
  • ESP8266+Tasmota智能电表DIY:从硬件选型到Home Assistant接入全流程(附避坑指南)
  • 用Matlab搞定偏微分方程数值解:从Poisson方程五点差分到Gauss-Seidel迭代的保姆级实战
  • OpenCV形态学处理实战:用C++手搓腐蚀膨胀算法,对比库函数效果
  • 智能问数大模型调用的4种部署方式
  • 国民技术 N32WB031KEQ6-2 QFN-32 蓝牙模块
  • 招生数据看不明白?大数据分析让智慧招生平台帮你理清思路
  • 网吧 / 营业厅实名核验更严了,帮你合规
  • 3分钟搞定PDF找茬:diff-pdf视觉对比神器完全指南
  • 基于COMSOL的BIC本征态计算通用算法:直观出图,适用于多种场景,附论文研究链接
  • XXL-JOB调度中心集群部署实战:从编译到反向代理全流程解析
  • 如何快速掌握ESP-CSI技术:无线感知的完整入门指南
  • 【生死心法】别用 assert() 谋杀物理世界!撕碎软件异常的“停机幻觉”,论“失效安全”与硬件级绝对熔断
  • Cursor+Apifox MCP Server:智能接口自动化测试的实践与突破
  • ThreeJS实战:如何优雅地给3D模型添加点击弹窗(附完整代码)
  • Win10 LTSC 1809(Hyper-V)环境下Docker与CVAT的兼容性部署指南
  • Node.js 日志选型指南:Winston vs Log4js 全方位对比与实战
  • 揭秘Stable Diffusion 3.5企业级部署瓶颈:3类GPU资源浪费模式及实时优化方案
  • 人工智能技术生成对抗网络图像合成与风格迁移应用
  • 给Pixel4注入新灵魂:手把手教你定制Android 12内核,开启隐藏功能与性能调优
  • JavaScript对象、原型与继承知识体系综合实战案例
  • 西门子S7-1200 PLC与Node-RED数据互通实战:从硬件接线到Web可视化(V18+TIA Portal)
  • 利用Emacs verilog-mode的AUTOINST与AUTOWIRE加速Verilog模块集成
  • 告别手动计算!用Excel小O地图插件3分钟搞定GPS坐标批量转换(度分秒/度/弧度互转)
  • 为什么你的项目还在用有漏洞的lodash?深入解析npm依赖管理的那些坑
  • Koikatu HF Patch终极指南:如何免费解锁完整英文翻译和200+插件