前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【迎战蓝桥杯】 算法·每日一题(详解+多解)-- day6

【迎战蓝桥杯】 算法·每日一题(详解+多解)-- day6

作者头像
苏州程序大白
发布于 2022-05-07 00:37:30
发布于 2022-05-07 00:37:30
17800
代码可运行
举报
运行总次数:0
代码可运行

【每日一道算法】 算法·每日一题(详解+多解)-- day6

✨博主介绍

🌊 作者主页:苏州程序大白 🌊 作者简介:🏆CSDN人工智能域优质创作者🥇,苏州市凯捷智能科技有限公司创始之一,目前合作公司富士康、歌尔等几家新能源公司

数组中和为 0 的三个数

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 abc ,使得 a + b + c = 0 ?请找出所有和为 0 且 不重复 的三元组。

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

示例 2: 输入:nums = [] 输出:[]

示例 3: 输入:nums = [0] 输出:[]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
提示:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105

解题思路

排序+暴力

时间复杂度O(N3),空间复杂度O(1)

  • 枚举第一个数,然后再使用双指针。
  • 首先排序,为了避免重复需要保证nums[i] != nums[i-1], 举例:[-6, -6, 3, 3]
  • 因为存在多组数据所以还需要在除了第一次确定以外,排除重复的
    • 举例:[-6, 2, 3, 3, 3, 3, 4, ]:可能的结果[-6, 2, 4], [-6, 3, 3], ==[-6, 3, 3]==这个已经重复了,所以需要排除
    • 排除重复while (left<right && nums[left] == nums[left+1]) left++;
    • 如果没有重复进入下一个索引left++;
  • 时间复杂度O(N2),空间复杂度O(N):结果空间。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        int n=nums.length;
        for (int i=0; i<n-2; i++){
            if (i>0 && nums[i] == nums[i-1]) continue;

            int left = i+1;
            int right = n-1;

            while(left<right){
                int cur = nums[i] + nums[left] + nums[right];
                if (cur<0) left++;
                else if (cur>0) right--;
                else {
                    res.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--;
                }
            }
        }
        return res;
    }
}

双指针

要把双指针的思路应用到三元组上, 就必须将问题化为双指针类型。

设数组元素 a,b,c, a + b + c = 0;

-a = b + c;

先针对一个元素 a, 从数组中找到两个元素 b、c 使之 b + c = -a;

这样一来, 问题就化简为: 找到数组中两个元素和为 -a

题目变成了两个元素XXX, 那么我们就好使用双指针来解决这道问题了。

我们先对数组进行排序, 来保证双指针的有序查找。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Arrays.sort(nums);

我们枚举每一个不重复的 a, 来保证已经出现的 (b + c) 组合不再重复。

为了达到这个效果, 我们可以先确定一个旧值 lastNum, 将当前值与旧值比较; 如果不相同, 则开始搜索满足条件的三元组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	class Solution {
		public List<List<Integer>> threeSum(int[] nums) {
			if (null == nums || 3 > nums.length) {
				return new ArrayList<>();
			}
			Arrays.sort(nums);
			int lastNum = Integer.MAX_VALUE;
			List<List<Integer>> result = new ArrayList<>();
			for (int i = 0; i < nums.length - 1; i++) {
				if (nums[i] == lastNum) {
					continue;
				}
				lastNum = nums[i];
				int left = i + 1;
				int right = nums.length - 1;
				int target = -nums[i];
				int sum;
				while (left < right) {
					sum = nums[left] + nums[right];
					if (sum == target) {
						result.add(Arrays.asList(lastNum, nums[left], nums[right]));
						++left;
						while(left < right && nums[left] == nums[left-1]){
							++left;
						}
						--right;
						while (left < right && nums[right] == nums[right + 1]) {
							--right;
						}
					} else if (sum > target) {
						--right;
					} else {
						++left;
					}
				}
			}
			return result;
		}
	}

三数之和,可以将其看成两数之和,再与第三个数之和对于两数之和,采用二分查找的思路

二分查找的一个非常重要的前提条件是数组是有序的,所以在查找之前先对数据进行排序遍历当前数组,目标值变为0-nums[i]二分查找和为0-nums[i]的两个数二分查找代码块。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector<vector<int>> process(vector<int>&nums,int target,int i,int n){
    int left=i,right=n;
    vector<vector<int>> res;
    while(left<right){
        int temp=nums[left]+nums[right];
        int lval=nums[left],rval=nums[right];//记录当前左右指针指向的值,因为遇到重复的值这样可以直接跳过
        if(temp<target){
            while(left<right&&nums[left]==lval)left++;
        }
        if(temp>target){
            while(left<right&&nums[right]==rval)right--;
        }
        if(temp==target){
            res.push_back({nums[left],nums[right]});
            while(left<right&&nums[left]==lval)left++;
            while(left<right&&nums[right]==rval)right--;//找到目标值了,left和right也要改变,这里记录一下,因为自己经常忘
        }
    }
    return res;
}

主函数模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector<vector<int>> threeSum(vector<int>& nums) {
    sort(nums.begin(),nums.end());//先对数组进行排序
    int n=nums.size()-1;
    vector<vector<int>> res;
    for(int i=0;i<n-1;++i){
        vector<vector<int>> temp=process(nums,0-nums[i],i+1,n);//寻找的范围是当前值后面的那个值一直到最后
        if(!temp.empty()){
            for(auto x:temp){
                x.push_back(nums[i]);
                res.push_back(x);
            }
        }
        while(i<n-1&&nums[i+1]==nums[i])i++;//这里同样用来排除重复值
    }
    return res;
}
 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
teprunner测试平台用例前置模块开发
现在正式进入测试相关功能开发。teprunner测试平台底层是pytest,中间层是tep,还没了解的朋友可以先看看tep的文章,整个平台的设计思路和后面用例的执行都会基于这个工具。tep的测试用例是放在.py文件里面的,全局变量或者说环境变量是引用的env_vars,公共函数和复用接口是引用的fixtures,在做成平台后,需要把这两个部分独立为两个功能模块。多个项目的接口自动化数据需要隔离开来,要有个项目管理功能。本文将开发四个用例前置模块:
dongfanger
2021/03/30
1.7K0
teprunner测试平台用例前置模块开发
【deepseek用例生成平台-09】初尝后端接口:公告信息功能
1. 管理员通过django后台数据库管理页面,直接打开数据库中存放公告信息的表,添加最新一条公告。
我去热饭
2025/03/07
1420
【deepseek用例生成平台-09】初尝后端接口:公告信息功能
Vue3入门笔记七----登录功能
这个系列的笔记重点会放在怎么样利用Vue3把项目架设起来并跟后端API互动,不会介绍Vue的基础特性,关于Vue的基础特性可以参考这个视频四个小时带你快速入门Vue,我是看这个入门的,觉得还不错。
panzhixiang
2024/10/30
1060
teprunner测试平台入门级部署手册发布啦
很多朋友是因为teprunner,也就是这个小众的pytest内核测试平台关注的公众号。为了让大家更好的上手teprunner,我更新了它的README,希望能让小伙伴们根据这些文档内容,一步一步的在自己本地电脑上把项目跑起来。项目跑起来之后,就可以参考前面一系列的学习教程,自己动手做一遍,在做的过程中和teprunner进行对比,不懂的点逐一突破,由点到面,完整实现。这种学习方式能更快速的掌握测试平台开发技能哦。
dongfanger
2021/08/24
7880
pytest内核测试平台落地初体验
测试平台,有人说它鸡肋,有人说它有用,有人说它轮子,众说纷纭,不如从自身出发,考虑是否要做测试平台:
dongfanger
2021/02/04
1.2K0
pytest内核测试平台落地初体验
teprunner测试平台测试计划批量运行用例
上一篇文章已经把pytest引入到测试平台中,通过多线程和多进程的方式,运行测试用例。有了这个基础,做批量运行用例的功能就很简单了,只需要前端传入一个CaseList即可。本文的后端代码是增删改查和复用run_case相关代码做个run_plan。前端代码将学习如何通过LocalStorage在非父子组件之间传递数据。具体开发内容如下:
dongfanger
2021/04/19
8170
teprunner测试平台测试计划批量运行用例
teprunner测试平台开发用例管理不只有增删改查
用例管理是对用例进行增删改查,按照前面文章的思路,把它做出来应该不难,如果你已经自己写好了,那么可以和本文提交的代码比较下看看。除了增删改查,用例管理还需要提供运行用例的入口,在操作列添加一个运行按钮,单条用例运行,并弹窗展示运行结果。用例列表需要能看到每条用例执行情况,添加表格列用于展示,其中“运行结果”列要有超链接,点击查看上次运行结果。为了避免修改别人用例出错,还需要有个复制用例功能。除了在线编辑,平台应支持下载项目环境到本地,无缝切换到PyCharm,让新用户快速上手。综上所述,本文开发内容如下:
dongfanger
2022/05/09
1.3K0
teprunner测试平台开发用例管理不只有增删改查
teprunner测试平台Django引入pytest完整源码
pytest登场!本文将在Django中引入pytest,原理是先执行tep startproject命令创建pytest项目文件,然后从数据库中拉取代码写入文件,最后调用pytest命令运行用例。为了提高运行效率,用例运行是并行的,采用了多线程和多进程,两个都有,这在最后有个单独小结进行比较完整的说明。因为用例运行是异步的,所以前端并不知道什么时候执行完才能拿到运行结果,可以发多个HTTP请求轮询,但这种方式并不优雅,本文将采用WebSocket来实现用例结果查询。具体内容为:
dongfanger
2021/04/02
1.1K0
Web安全工具开发
项目从12月底至今,期间因各种原因断断续续的开发,前前后后已经发布了5个版本,从最初只有框架的 V1.0 版本,到如今功能日趋完善的 V2.3 版本项目正在不断完善中,现已集成端口扫描、指纹识别、旁站探测、信息泄露扫描、安全导航等多个功能,后续将加入漏洞检测、目录识别、域名探测等功能,一起期待吧!页面我们尽可能做到简单、清新,便于用户使用。现 UI 已经适配PC端、Phone端、Pad端,使用户得到舒适的使用体验。我们致力于打造一款安全高效、操作简单、界面清爽、兼容适配的安全工具。本项目的灵感来自于国光师傅的文章Django 编写 Web 漏洞扫描器挖坑记录。就像国光师傅说的那样我们无论是开发还是安全都有很长的路要走,路漫漫其修远兮,吾将上下而求索!
小简
2023/01/04
1.5K0
Web安全工具开发
数据工厂平台-6:继续VUE和DJANGO的踩坑
用的是Django和VUE技术。 正常来说,vue并不支持DJANGO,它和DJANGO的冲突很多也很麻烦,甚至python2的话会有无解的问题出现。
我去热饭
2022/05/19
1.9K0
数据工厂平台-6:继续VUE和DJANGO的踩坑
Vue3 后台管理系统模板推荐
之前写了一篇关于 Vue2 的后台管理系统模板的推荐,详情请见 Vue后台管理系统模板推荐。
唐志远
2022/10/27
8.3K0
Vue3 后台管理系统模板推荐
一套开源通用后台管理系统,赚钱靠它了!
这套Base Admin是一套简单通用的后台管理系统,主要功能有:权限管理、菜单管理、用户管理,系统设置、实时日志,实时监控,API加密,以及登录用户修改密码、配置个性菜单等
程序员小猿
2021/01/20
6450
一套开源通用后台管理系统,赚钱靠它了!
数据工厂平台-3:首页超链接
上一节我们成功搞定了首页的展示。但是其中并没有加入任何数据,也就是仅仅展示了html模版而已,本节课我们要加入数据,那么具体是什么数据呢?按照比较成功的经验,首页放入公司内的各种超链接比较好,容易让使用者产生依赖和粘性。
我去热饭
2022/05/19
7310
数据工厂平台-3:首页超链接
几乎不写一行代码,快速开发后台功能
👆点击“博文视点Broadview”,获取更多书讯 Python 长期稳居编程语言排行的前五,不仅已经成为数据分析、人工智能领域必不可少的工具,还被越来越多地公司用于网站搭建。Python 方向岗位的薪水在水涨船高,成为目前最有潜力的编程语言之一。 目前,市场上的Python基础书很多了,那你在学完Python基础书后有没有兴趣用Python的Web框架Django来进行网站开发呢? 本文将介绍商城系统后台的需求分析、架构设计及数据库设计。 商城系统后台,使用Django框架自带的Admin后台管理系统来
博文视点Broadview
2022/07/25
9960
几乎不写一行代码,快速开发后台功能
vue08首页导航和左侧菜单+mockjs介绍以及使用+登陆注册跳转
14天阅读挑战赛 努力是为了不平庸~ 目录 1. mockjs 1.1 mockjs介绍 1.2 mockjs使用步骤 1.2.1 安装mockjs依赖 1.2.2 在项目中引入mockjs 1.2.3 创建目录和文件 1.2.4 为每个组件准备模拟数据 1.2.5 测试 1.2.6 前端调试 1.2.7 mockjs生成随机响应数据 1.2.8 根据不同响应,给出不同提示 2. 登录注册间的跳转 2.1 加入登录及注册按钮 2.2 增加注册组件 2.3 配置路由 3. 系统首页 3.1 准备 3.2 M
天蝎座的程序媛
2022/11/18
1.3K0
vue08首页导航和左侧菜单+mockjs介绍以及使用+登陆注册跳转
kz-admin后台管理系统
当时初学 Web 开发的时候,除了写一个网页博客外,第二个选择无非就是一个后台管理系统,可以应用于多种需要数据管理类项目中。
愧怍
2022/12/27
2.1K0
kz-admin后台管理系统
vite+Vue3+ts搭建通用后台管理系统
本文主要讲解使用vite来作为脚手架开发。(动手能力强的小伙伴完全可以使用vite做开发服务器,使用webpack做打包编译放到生产环境)
ConardLi
2021/09/08
6800
vite+Vue3+ts搭建通用后台管理系统
前后端分离如何做权限控制设计?
网上很多前、后端分离权限仅仅都仅仅在描述前端权限控制、且是较简单、固定的角色场景,满足不了我们用户、角色都是动态的场景。
Java技术栈
2019/11/11
7K0
前后端分离如何做权限控制设计?
Django+Vue开发生鲜电商平台之7.用户登录和注册功能
Github和Gitee代码同步更新: https://github.com/PythonWebProject/Django_Fresh_Ecommerce; https://gitee.com/Python_Web_Project/Django_Fresh_Ecommerce。
cutercorley
2020/07/30
4.5K0
Django+Vue开发生鲜电商平台之7.用户登录和注册功能
Vue3+Element-plus前端学习笔记-巨长版
「写好的代码」:Lvan826199/mwj-vue3-project: vue3-vite构建的一个前端模版 (github.com)
梦无矶小仔
2024/03/25
7990
Vue3+Element-plus前端学习笔记-巨长版
推荐阅读
相关推荐
teprunner测试平台用例前置模块开发
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验