leetcode第15题

简介: 参考了这里-Java-solution)主要思想是,遍历数组,用 0 减去当前的数,作为 sum ,然后再找两个数使得和为 sum。这样看来遍历需要 O(n),再找两个数需要 O(n²)的复杂度,还是需要 O(n³)。巧妙之处在于怎么找另外两个数。最最优美的地方就是,首先将给定的 num 排序。这样我们就可以用两个指针,一个指向头,一个指向尾,去找这两个数字,这样的话,找另外两个数时间复杂度就会从 O(n²),降到 O(n)。而怎么保证不加入重复的 list 呢?要记得我们的 nums 已经有序了,所以只需要找到一组之后,当前指针要移到和当前元素不同的地方。其次在遍

image.png

top15

解法一 暴力解法

无脑搜索,三层循环,遍历所有的情况。但需要注意的是,我们需要把重复的情况去除掉,就是 [1, -1 ,0] 和 [0, -1, 1] 是属于同一种情况的。

publicList<List<Integer>>threeSum(int[] nums) {
List<List<Integer>>res=newArrayList<List<Integer>>();
for (inti=0; i<nums.length; i++) {
for (intj=i+1; j<nums.length; j++)
for (intk=j+1; k<nums.length; k++) {
if (nums[i] +nums[j] +nums[k] ==0) {
List<Integer>temp=newArrayList<Integer>();
temp.add(nums[i]);
temp.add(nums[j]);
temp.add(nums[k]); 
//判断结果中是否已经有 temp 。if (isInList(res, temp)) {
continue;
                    }
res.add(temp);
                }
            }
    }
returnres;
}
publicbooleanisInList(List<List<Integer>>l, List<Integer>a) {
for (inti=0; i<l.size(); i++) {
//判断两个 List 是否相同if (isSame(l.get(i), a)) {
returntrue;
        }
    }
returnfalse;
}
publicbooleanisSame(List<Integer>a, List<Integer>b) {
intcount=0;
Collections.sort(a);
Collections.sort(b);
//排序后判断每个元素是否对应相等for (inti=0; i<a.size(); i++) {
if (a.get(i) !=b.get(i)) {
returnfalse;
        }
    }
returntrue;
}

时间复杂度:n 表示 num 的个数,三个循环 O(n³),而 isInList 也需要 O(n),总共就是 O(n^4)O(n4),leetCode 复杂度到了 O(n^3)O(n3) 一般就报超时错误了,所以算法还得优化。

空间复杂度:最坏情况,即 O(N), N 是指 n 个元素的排列组合个数,即 N=C^3_nN=Cn3,用来保存结果。

解法二

参考了这里-Java-solution)

主要思想是,遍历数组,用 0 减去当前的数,作为 sum ,然后再找两个数使得和为 sum。

这样看来遍历需要 O(n),再找两个数需要 O(n²)的复杂度,还是需要 O(n³)。

巧妙之处在于怎么找另外两个数。

最最优美的地方就是,首先将给定的 num 排序。

这样我们就可以用两个指针,一个指向头,一个指向尾,去找这两个数字,这样的话,找另外两个数时间复杂度就会从 O(n²),降到 O(n)。

而怎么保证不加入重复的 list 呢?

要记得我们的 nums 已经有序了,所以只需要找到一组之后,当前指针要移到和当前元素不同的地方。其次在遍历数组的时候,如果和上个数字相同,也要继续后移。文字表述比较困难,可以先看下代码。

publicList<List<Integer>>threeSum(int[] num) {
Arrays.sort(num); //排序List<List<Integer>>res=newLinkedList<>(); 
for (inti=0; i<num.length-2; i++) {
//为了保证不加入重复的 list,因为是有序的,所以如果和前一个元素相同,只需要继续后移就可以if (i==0|| (i>0&&num[i] !=num[i-1])) {
//两个指针,并且头指针从i + 1开始,防止加入重复的元素intlo=i+1, hi=num.length-1, sum=0-num[i];
while (lo<hi) {
if (num[lo] +num[hi] ==sum) {
res.add(Arrays.asList(num[i], num[lo], num[hi]));
//元素相同要后移,防止加入重复的 listwhile (lo<hi&&num[lo] ==num[lo+1]) lo++;
while (lo<hi&&num[hi] ==num[hi-1]) hi--;
lo++; hi--;
                } elseif (num[lo] +num[hi] <sum) lo++;
elsehi--;
           }
        }
    }
returnres;
}

时间复杂度:O(n²),n 指的是 num

空间复杂度:O(N),最坏情况,即 N 是指 n 个元素的排列组合个数,即 N=C^3_nN=Cn3,用来保存结果。

对于遍历,这里用到了从两头同时遍历,从而降低了时间复杂度,很妙!



相关文章
|
安全 网络安全 开发者
网站跳转到反诈中心该怎么处理解封恢复正常访问
作为一个网站开发者,我曾经经历了这样的情况:我建设的公司网站被标识为恶意网站,被拦截了。通过调查,我发现这是因为反诈中心下发了拦截令。这种拦截方法为网站域名拦截,即由最高部门下发到各地防诈中心和运营商进行拦截。如果用户打开这样的网站,将会出现解析错误,无法访问。总的来说,网站域名拦截是一种阻断诈骗网站的有效手段,但是在实际操作中也需要更加严格的审核,以防止出现误判的情况。我认为,反诈工作是需要不断提高的,同时也需要更加完善的机制和法律支持。
9781 0
网站跳转到反诈中心该怎么处理解封恢复正常访问
|
机器学习/深度学习 算法 安全
密码学系列之五:MD5、SHA1——一文搞懂哈希函数
密码学系列之五:MD5、SHA1——一文搞懂哈希函数
10992 113
|
机器学习/深度学习 存储 人工智能
云计算平台选择之路:AWS、Azure和Google Cloud的比较与抉择
在当今数字化时代,云计算平台扮演着企业转型和创新的关键角色。本文将对三大主流云计算平台——AWS、Azure和Google Cloud进行比较分析,为读者提供选择指南。我们将从性能、可靠性、生态系统、服务和定价等方面综合评估,以帮助读者做出最适合他们业务需求的决策。
1550 0
|
3月前
|
机器学习/深度学习 监控 算法
基于 YOLO26的5类人体行为姿态智能检测(中英文双版) | 附完整源码与效果演示
本文介绍了基于YOLO26的人体行为姿态智能检测系统的设计与实现。该系统采用YOLO26作为基础模型,实现了对5种人体行为姿态的实时检测。系统的主要特点包括: 高精度:采用YOLO26作为基础模型,结合数据增强和模型优化技术,提高了检测精度。 实时性:YOLO26的推理速度快,能够实现实时人体行为姿态检测。 多场景适应性:模型在不同场景下都能保持较好的检测性能。 易于部署:系统的安装和部署过程简单,便于在实际应用中使用。 基于YOLO26的人体行为姿态智能检测系统在智能安防、体育训练、智能家居等领域具有广泛的应用前景。未来,我们将进一步优化模型,提高检测精度和速度,拓展检测的行为类别,为更多
|
3月前
|
存储 人工智能 弹性计算
7×24小时AI助理零基础GET指南:OpenClaw(原Clawdbot)阿里云部署及使用解析
你是否幻想过拥有一个全天候在线的AI助手?它不仅能陪你聊天,还能清理邮箱、规划日程、编写代码,甚至自主安装新功能,帮你处理工作生活中的各类琐事。2026年,这款名为OpenClaw(前身为Clawdbot、Moltbot)的开源工具,在短短两个月内斩获近10万GitHub星标,成为史上增长最快的开源项目之一,掀起了个人AI助手的全新浪潮。
1383 2
|
4月前
|
开发者
Mac Axure RP 9.dmg 安装教程 简单步骤 含汉化方法
Axure RP 9 是专为原型设计打造的工具,适用于绘制网页与APP交互稿,支持无代码预览产品效果。本文介绍其在Mac上的下载、安装、授权及中文汉化步骤,助你快速上手使用。(238字)
1584 3
|
4月前
|
弹性计算 运维 搜索推荐
阿里云客服体系解读,售前、售后全方位服务方式介绍,高效响应
本文详细解析了阿里云客服的服务体系、优势与特色以及如何通过多种渠道为客户提供全方位的支持。帮助大家更全面地了解阿里云客服并更好地利用阿里云的服务资源。同时,阿里云客服也将不断优化服务流程和提升服务质量,为客户提供更加优质、高效的服务体验。
|
机器学习/深度学习 人工智能 移动开发
阿里又出新玩法|开箱即用的算法集 MNN Kit
今天的移动开发,AI随处可见:从手机淘宝里的拍立淘,到淘宝直播里的商品识别,到头条的个性化推荐,到抖音直播里的人脸识别,人工智能在移动app里发挥的作用越来越大。它也逐渐从Snapchat那些社交软件的一些比较好玩的属性(如人脸贴纸),慢慢发展到了淘宝里面那些能够真正为商业赋能的应用场景。在这样的背景下,阿里巴巴淘系技术的MNN团队,近日发布了开箱即用的工具集MNN Kit。
3392 0
阿里又出新玩法|开箱即用的算法集 MNN Kit
|
机器学习/深度学习 人工智能 PyTorch
使用PyTorch实现GPT-2直接偏好优化训练:DPO方法改进及其与监督微调的效果对比
本文将系统阐述DPO的工作原理、实现机制,以及其与传统RLHF和SFT方法的本质区别。
1442 22
使用PyTorch实现GPT-2直接偏好优化训练:DPO方法改进及其与监督微调的效果对比
|
编解码 监控 网络协议
HLS 和 RTSP 的优势
【10月更文挑战第25天】HLS和RTSP各自的优势使其在不同的应用场景中发挥着重要作用。HLS适用于需要广泛兼容性、自适应码率和简单部署的场景,如在线视频点播、直播等;而RTSP则更适合对实时性、精确播放控制和互操作性要求较高的专业级实时流媒体应用。了解它们的优势有助于根据具体的项目需求选择最合适的流媒体传输协议。
611 61