【算法训练-哈希】两数之和、三数之和

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是两数之和和三数之和,使用哈希这个基本的数据结构来实现
在这里插入图片描述

两数之和【EASY】

照例先从简单往难搞

题干

在这里插入图片描述

输入:
[3,2,4],6返回值:
[2,3]说明:
因为 2+4=6 ,而 2的下标为24的下标为3 ,又因为 下标2 < 下标3 ,所以返回[2,3] 
输入:
[20,70,110,150],90返回值:
[1,2]说明:
20+70=90     

解题思路

哈希 实现。从题中给出的有效信息:找出下标对应的值相加为target,数组中存在唯一解,故此 可以使用 直接遍历或者 hash表来解答,直接双重循环遍历时间复杂度太高,而上篇Blog我们应该还记得:【算法训练-模拟】模拟设计LRU缓存结构
在这里插入图片描述

代码实现

Java代码实现:

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param numbers int整型一维数组* @param target int整型* @return int整型一维数组*/public int[] twoSum (int[] numbers, int target) {// 1 用哈希表记录出现过的数字,key为数字,value为下标Map<Integer, Integer> map = new HashMap<>();int[] result = new int[2];for (int i = 0; i < numbers.length; i++) {// 得出需要的差值是多少int needVal = target - numbers[i];if (map.containsKey(needVal)) {// 如果map存储了差值则记录两数result[0] = map.get(needVal);result[1] = i + 1;} else {// 如果map未存储差值则将当前值存储map.put(numbers[i], i + 1);}}return result;}
}

复杂度分析

时间复杂度O(N):遍历了数组;空间复杂度O(N),定义了哈希结构存储数据。相比于双重循环这种方式是典型的空间换时间

三数之和【MID】

好的,难度升级,进入三数之和:
加粗样式

输入:
[0]返回值:
[]
输入:
[-2,0,1,1,2]返回值:
[[-2,0,2],[-2,1,1]]
输入:
[-10,0,10,20,-10,-40]返回值:
[[-10,-10,20],[-10,0,10]]

解题思路

排序+双指针实现。关键点:三元组按照升序排列;不能出现重复三元组。值得注意的是,虽然这里可以继续用哈希+双重循环把两数之和转为三数之和,但没有必要,因为我们之所以用哈希主要是为了找下标,而题目没有要求给出下标,只要给出值的三元组即可,所以这里用哈希反而增加了空间复杂度,并且也没有降低时间复杂度。

代码实现

使用Java实现,特别注意的是基准值、左指针和右指针都需要避免重复的情况

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param num int整型一维数组* @return int整型ArrayList<ArrayList<>>*/public ArrayList<ArrayList<Integer>> threeSum (int[] num) {// 1 定义返回结果ArrayList<ArrayList<Integer>> result = new ArrayList<>();// 排除不满足条件的numif (num == null || num.length < 3) {return result;}// 2 要求非降序排列,且为了应用左右指针及去重考虑,先对整个数组升序排列Arrays.sort(num);// 3 遍历数组,以其中一个数为基准,双指针寻找另外两个数for (int i = 0; i < num.length - 2; i++) {// 减少无效遍历,去掉无效情况,如果第一个数都大于0,那总和一定大于0if (num[i] > 0) {break;}// 排除基准数的重复值if (i > 0 && num[i] == num[i - 1]) {continue;}int left = i + 1, right = num.length - 1;int target = -num[i];while (left < right) {if (num[left] + num[right] == target) {// 存放满足条件的三元组并移动指针result.add(new ArrayList<>(Arrays.asList(num[i], num[left], num[right])));// 基准数固定,指针移动,左指针向右,右指针必须向左【左+右】为固定值,如果左值不变,右值也不变就重复了,如果左值变,右值就不可能和原来一致,所以必须向左寻求新值。left++;right--;// 由于数组已经排序,所以可能出现重复三元组的数据就在相邻位置,所以需要越过相邻位置的重复三元组while (left < right && num[left] == num[left - 1]) {left++;}while (left < right && num[right] == num[right + 1]) {right--;}} else if (num[left] + num[right] > target) {// 大于目标值,右指针向左减小总值right--;} else {// 小于目标值,左指针向右扩大总值left++;}}}return result;}
}

复杂度分析

时间复杂度:O(n log n) 【排序】+ O(n^2)【外层for循环和内层while循环】
空间复杂度:O(1),排除结果的数据结构

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

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

相关文章

【数学建模竞赛】各类题型及解题方案

评价类赛题建模流程及总结 建模步骤 建立评价指标->评价体系->同向化处理&#xff08;都越多越好或越少越少&#xff09;->指标无量纲处理 ->权重-> 主客观->合成 主客观评价问题的区别 主客观概念主要是在指标定权时来划分的。主观评价与客观评价的区别…

算法通过村第三关-数组白银笔记|数组双指针

文章目录 前言什么是数组双指针数组中删除元素专题原地移除所有等值val的元素快慢双指针对撞双指针对撞覆盖 删除有序数组中的重复项 总结 前言 提示&#xff1a;世间从不缺少辉煌的花冠&#xff0c;缺少的是被花冠渲染的淡定。 什么是数组双指针 这是一种长期总结下来的思想&…

Node.js crypto模块 加密算法

背景 微信小程序调用飞蛾热敏纸打印机&#xff0c;需要进行参数sig签名校验&#xff0c;使用的是sha1进行加密 // 通过crypto.createHash()函数&#xff0c;创建一个hash实例&#xff0c;但是需要调用md5&#xff0c;sha1&#xff0c;sha256&#xff0c;sha512算法来实现实例的…

jq——点击显示隐藏来回切换、图片来回切换

案例展示 案例代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>显示隐藏</title></head><script src"js/jquery.js"></script><style>.switch {width: 50px;height: 50px;…

LNMT搭建部署

目录 一、概述 二、Nginx高级配置 三、搭建 一、概述 所谓的LNMT架构指的就是Linux操作系统上部署Nginx web服务器、MySQL数据库服务器、Tomcat中间件服务器。 二、Nginx高级配置 location 精确匹配 ^~ 不用正则的字符串匹配 …

惠普NS1020激光打印机碳粉警告提示及添加碳粉方法

本文也适用于惠普NS1020、1020c 和 1020w 系列打印机。 通过碳粉量指示灯检查碳粉量。 如果碳粉量是满的或指示器显示 1&#xff0c;可选择添加一个碳粉或者忽略不添加。如果碳粉量指示灯显示 2或 2 和碳粉量警告感叹号图标 &#xff0c;则表示碳粉量不足或严重不足&#xff0…

[Linux]命令行参数和进程优先级

[Linux]命令行参数和进程优先级 文章目录 [Linux]命令行参数和进程优先级命令行参数命令行参数的概念命令函参数的接收编写代码验证 进程优先级进程优先级的概念PRI and NI使用top指令修改nice值 命令行参数 命令行参数的概念 命令行参数是指用于运行程序时在命令行输入的参数…

vue三级市区联动

默认返回值格式&#xff1a;all:code、name都返回 name:只返回name code:只返回code&#xff0c;level&#xff1a;可设置显示层级 1&#xff1a; 省 2&#xff1a; 省、市 3&#xff1a; 省、市、区 v-model 默认值 可以是 name: [ "天津市", "天津市",…

爬虫逆向实战(二十三)--某准网数据

一、数据接口分析 主页地址&#xff1a;某准网 1、抓包 通过抓包可以发现数据接口是api_to/search/company_v2.json 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现b参数和kiv参数是加密参数 请求头是否加密&#xff1f; 无响应是否加…

十四五双碳双控时代下的“低碳认证”

目录 前言 十四五双碳双控时代下的“低碳认证” 一、关于“低碳认证” 二、低碳认证优势 三、环境产品认证EPD 四、EPD相关运营机构 五、碳中和相关机构 六、EPD的认证流程 七、低碳产品认证认证流程和要求 八、相关机构认证证书样例 九、证书附件表 前言 通过本篇文…

柠檬水找零【贪心算法-】

柠檬水找零 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品&#xff0c;&#xff08;按账单 bills 支付的顺序&#xff09;一次购买一杯。 每位顾客只买一杯柠檬水&#xff0c;然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零&…

CSS按钮-跑马灯边框

思路很简单&#xff0c;实现方法有很多很多。但是大体思路与实现方法都类似&#xff1a;渐变色 动画&#xff0c;主要区别在动画的具体实现 0、HTML 结构 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><titl…