LeetCode --- 三数之和

题目描述

三数之和

代码解析

暴力

在做这一道题的时候,脑海里先想出来的是暴力方法,一次排序,将这个数组变为有序的,再通过三次for循环来寻找满足条件的数字,然后将符合条件的数组与之前符合条件的数组进行一一对比,来完成去重的目的,时间复杂度光是三层for循环就达到了n^3,再加上一个sort和count函数,nlogn + mn^3。

class Solution {
public:bool chech(int a, int b, int c){return a + b + c == 0;}vector<vector<int>> threeSum(vector<int>& na) {vector<vector<int>> ans;int n = na.size();sort(na.begin(), na.end());for (int i = 0; i < n; i++){for (int j = i + 1; j < n; j++){for (int k = j + 1; k < n; k++){if (chech(na[i], na[k], na[j])){vector<int> a(3, 0);a[0] = na[i];a[1] = na[j];a[2] = na[k];if (count(ans.begin(), ans.end(), a) == 0)ans.push_back(a);}}}}return ans;}
};


优化

这个时候要想代码如何进行优化,如何把判重的count和后两层循环给优化了,这样就能把时间复杂度从nlogn + mn^3降低到nlogn + n^2。

要找一个满足条件的三个数,我们可以先固定一个数字,然后就可以只考虑除固定数字之外的区间了,在另一个区间可以找两个指针l和r,如果说l指针指向的数字+r指针指向的数字,等于 事前固定的数字的相反数,就可以达到题目要求了。

如果说l+r > -i,说明r太大,r--;或者说是r + l > -i,说明l太小,l++。当l和r相交的时候依旧没有找到答案,就说明i在某个固定的位置是没有解的,将i++,即可。然后继续在l和r区间寻找符合题意的数字。

题目要求不能有重复的,什么情况下会出现重读的?当l + r == -i的时候,l的下一位或者r的上一位跟l或r本身是相同的,就说明出现了重复的情况,也有可能是i跟i的下一位相同。所以可以以此为条件,来进行去重。也可以将所有符合题意的答案都加入到一个数组当中,然后使用去重算法,也可以达到去重的目的。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int n = nums.size();sort(nums.begin(), nums.end());vector<vector<int>> res;for (int i = 0; i < n;){if (nums[i] > 0) break;int l = i + 1, r = n - 1;int t = -nums[i];while (l < r){int sum = nums[l] + nums[r];if (sum > t) r--;else if (sum < t) l++;else {res.push_back({nums[l], nums[r], nums[i]});l++, r--;while (l < r && nums[l] == nums[l - 1]){l++;}while (l < r && nums[r] == nums[r + 1]) {r--;}}}i++;while (i < n && nums[i] == nums[i - 1]) i++;}return res;}
};

 

扩展

四数之和

四数之和和三数之和的代码类似,可以当练习做一下。 

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {int n = nums.size();vector<vector<int>> res;sort(nums.begin(), nums.end());for (int i = 0; i < n ; ){for (int j = i + 1; j < n; ){int l = j + 1;int r = n - 1;long long tmp = nums[i] + nums[j];long long t = target - tmp;while (l < r){if ((long long)(nums[l] + nums[r]) > t) r--;else if ((long long)(nums[l] + nums[r]) < t) l++;else {res.push_back({nums[i], nums[j], nums[l], nums[r]});l++;r--;while (l < r && nums[l] == nums[l - 1]){l++;}while (l < r && nums[r] == nums[r + 1]) {r--;}}}j++;while (j < n && nums[j] == nums[j - 1]) j++;}i++;while (i < n && nums[i] == nums[i - 1]) i++;}return res;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/724081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.3.6补题

1.关鸡 对于这一道题&#xff0c;我们先按照题意进行分析&#xff1a;首先鸡自己的初始位置&#xff0c;如果着火点在鸡一开始的左右下各有一个那么就可以达到题目效果&#xff0c;也就是说不需要添加着火点&#xff0c;同时最多需要添加的着火点其实也就是它初始位置身边所有的…

Optional 详解

Optional 详解 1、Optional 介绍2、创建 Optional 对象3、Optional 常用方法1. 判断值是否存在 — isPresent()2. 非空表达式 — ifPresent()3. 设置(获取)默认值 — orElse()、orElseGet()4. 获取值 — get()5. 过滤值 — filter()6. 转换值 — map() 作为一名 Java 程序员&am…

animation给同一个元素加多个动画

需求&#xff1a; 元素从右向左渐变滑入&#xff0c;然后再上下漂浮 代码实现&#xff1a; animation动画可连写 <style lang"less" scoped>//swipe-item里面所有animate动画延迟时间swipe-animation-delay:500ms;//animate.css动画时长animate-css-duration:…

电子电器架构刷写策略 —— 队列刷写

电子电器架构刷写策略 —— 队列刷写 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

关于rocky linux配置RHEL9在线镜像源

Rocky Linux 简介 Rocky Linux 是一个社区支持的企业级 Linux 发行版&#xff0c;旨在为 CentOS Stream 提供一个稳定、可预测的替代方案。它与 CentOS Linux 兼容&#xff0c;并承诺提供 10 年的支持。Rocky Linux 适用于需要一个稳定、可预测的企业级 Linux 发行版&#xff…

算法练习第十二天|二叉树的递归遍历和迭代遍历

二叉树的遍历方式有广度还有深度方式 深度优先遍历&#xff1a;先往深走&#xff0c;遇到叶子节点再往回走。 广度优先遍历&#xff1a;一层一层的去遍历。 本文写的是深度优先遍历&#xff0c;分为前序&#xff0c;中序&#xff0c;后序遍历。这里前中后&#xff0c;其实指的就…

wpf 由于尚未生成某些自定义元素,设计视图无法正确显示。

"WPF 由于尚未生成某些自定义元素&#xff0c;设计视图无法正确显示" 这个问题通常是由于 Visual Studio 设计时的限制或某些资源未正确加载导致的。以下是一些可能的解决方案&#xff1a; 1. 重新生成项目&#xff1a; 尝试重新生成整个项目&#xff0c;以确保所有…

EasyX的学习2

消息处理——漂亮的按钮(鼠标) 用到的函数 1.消息结构体变量类型&#xff1a;使用ExMessage ExMessage msg{ 0 }; 定义一个变量名为msg的ExMessage结构体变量并初始化为0 2.获取消息函数&#xff1a;peekmessage函数 //获取消息 peekmessage(&msg, EX_MOUSE); 两个参…

Freertos自学笔记1----参考正点原子视频

RTOS与裸机系统对比记忆&#xff1a; 裸机系统&#xff1a;前后台系统&#xff1b; RTOS&#xff1a;实时操作系统&#xff0c;讲究实时性&#xff1b; 裸机系统中通常我们将需要工作的函数全部放在主while(1){}中&#xff0c;所有需要工作的函数独立排列&#xff0c;然后依次…

【Linux】基本指令(中)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:Linux ⚙️操作环境:Xshell (操作系统:CentOS 7.9 64位) 目录 man指令 cp指令 mv指令 cat指令 more指令 less指令 head指令 …

如何对酒店开展科学的定岗定编——以酒店健身房、娱乐房为例

近年来&#xff0c;随着旅游行业的快速发展&#xff0c;也带动了酒店业的兴盛。酒店的经营效益不仅受益于旅游业&#xff0c;同时也受制于旅游行业。由于旅游业存在明显的季节性差异&#xff0c;旅游旺季客流量多、淡季客流量少&#xff0c;造成人员忙闲不均的问题。酒店行业也…

Vue自定义组件实现v-model

前言 v-model 实际上就是 $emit(input) 以及 props:value 的组合语法糖。 1.封装自定义组件 要在 Vue 中实现自定义组件的 v-model 功能&#xff0c;你可以通过使用 model 选项来定义组件的 prop 和事件。以下是一个示例代码&#xff0c;演示如何实现一个自定义组件并使用 v…

gofly接口入参验证使用介绍

接口传入的参数做相关性质验证是开发中较为常用&#xff0c;gofly框架内置校验工具&#xff0c;提供开发效率&#xff0c;开发接口简单调用即可实现验证&#xff0c;下面介绍gofly框架数据验证设计思路及使用方法。 gofly框架提供了功能强大、使用便捷、灵活易扩展的数据/表单…

闰年导致的哪些 Bug

每次闰年对程序员们都是一个挑战&#xff0c;平时运行好好的系统&#xff0c;在 02-29 这一天&#xff0c;好像就会有各种毛病。 虽然&#xff0c;提前一天&#xff0c;领导们都会提前给下面打招呼。但是&#xff0c;不可避免的&#xff0c;今天公司因为闰年还是有一些小故障。…

Linux conntrack和iptables技术解析

Linux虚拟文件系统管理技术 1. netfilter解析1.1 netfilter的基础原理1.2 netfilter的相关hook 2. conntrack解析2.1 conntrack的基础原理2.2 conntrack的表记录解析 3. iptables解析3.1 iptables基础原理3.2 融合conntrack表的iptables规则 4. 疑问和思考4.1 conntrack和iptab…

医学知识和医疗应用开发交叉领域中垂类大语言模型应用相关研究

前言&#xff1a; 基于公司对LLM落地的期望&#xff0c;此proposal尚未研究完毕&#xff0c;只是简单做了一些消息整合和建议。 关于知识细节详见末尾Refs 背景&#xff1a; 随着LLM&#xff08;大语言模型&#xff09;的爆火&#xff0c;不少企业都在寻找通过LLM解决企业业…

揭秘:小红书笔记详情API如何助力电商提升营销效果

小红书是一个流行的社交电商平台&#xff0c;用户可以在上面分享购物心得、晒单、评论商品等。对于电商来说&#xff0c;了解小红书用户的行为和喜好&#xff0c;以及他们的购物决策过程&#xff0c;是提升营销效果的关键。小红书提供了笔记详情API&#xff0c;使得电商能够获取…

【学习笔记】java项目:黑马头条(day01)

文章目录 环境搭建、SpringCloud微服务(注册发现、服务调用、网关)1)课程对比2)项目概述2.1)能让你收获什么2.2)项目课程大纲2.3)项目概述2.4)项目术语2.5)业务说明 3)技术栈4)nacos环境搭建4.1)虚拟机镜像准备4.2)nacos安装 5)初始工程搭建5.1)环境准备5.2)主体结构 6)登录6.1…

Linux网络隧道协议IPIP认知(基于Linux network namespace 的 IPIP 隧道通信)

写在前面 博文内容为 Linux 隧道通信 IPIP认知内容涉及&#xff1a;ipip 介绍&#xff0c;一个 ipip 通信 Demo 以及数据帧流转分析理解不足小伙伴帮忙指正 某些人和事&#xff0c;哪怕没有缘分&#xff0c;是路边的风景&#xff0c;可是只要看一眼&#xff0c;依然会让人觉得…

高转化利器】Xinstall实现H5唤醒App,打开指定页面,轻松满足营销需求!

在移动互联网时代&#xff0c;App的拉新促活对于企业的发展至关重要。为了提升用户体验和转化率&#xff0c;Xinstall推出了一项强大的功能——H5唤醒App。通过这一功能&#xff0c;用户可以直接从Web页面拉起App&#xff0c;并在拉起过程中通过传参打开指定页面&#xff0c;满…