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

代码随想录--哈希表--两数之和

题目

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

思路

暴力的解法是两层for循环查找,时间复杂度是O(n^2)。
public class Solution {
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) {
return new int[] {i, j};
}
}
}
// 按照题目描述,这里不会运行到,因为总是会有一个解
throw new IllegalArgumentException(“No two sum solution”);
}

public static void main(String[] args) {Solution solution = new Solution();int[] nums = {2, 7, 11, 15};int target = 9;int[] result = solution.twoSum(nums, target);System.out.println("Indices: [" + result[0] + ", " + result[1] + "]");
}

}
当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。

需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。
在这里插入图片描述在这里插入图片描述C++代码:

class Solution {
public:
vector twoSum(vector& nums, int target) {
std::unordered_map <int,int> map;
for(int i = 0; i < nums.size(); i++) {
// 遍历当前元素,并在map中寻找是否有匹配的key
auto iter = map.find(target - nums[i]);
if(iter != map.end()) {
return {iter->second, i};
}
// 如果没找到匹配对,就把访问过的元素和下标加入到map中
map.insert(pair<int, int>(nums[i], i));
}
return {};
}
};

时间复杂度: O(n)
空间复杂度: O(n)

Java

//使用哈希表
public int[] twoSum(int[] nums, int target) {
int[] res = new int[2];
if(nums == null || nums.length == 0){
return res;
}
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
int temp = target - nums[i]; // 遍历当前元素,并在map中寻找是否有匹配的key
if(map.containsKey(temp)){
res[1] = i;
res[0] = map.get(temp);
break;
}
map.put(nums[i], i); // 如果没找到匹配对,就把访问过的元素和下标加入到map中
}
return res;
}

//使用双指针
public int[] twoSum(int[] nums, int target) {
int m=0,n=0,k,board=0;
int[] res=new int[2];
int[] tmp1=new int[nums.length];
//备份原本下标的nums数组
System.arraycopy(nums,0,tmp1,0,nums.length);
//将nums排序
Arrays.sort(nums);
//双指针
for(int i=0,j=nums.length-1;i<j;){
if(nums[i]+nums[j]<target)
i++;
else if(nums[i]+nums[j]>target)
j–;
else if(nums[i]+nums[j]==target){
m=i;
n=j;
break;
}
}
//找到nums[m]在tmp1数组中的下标
for(k=0;k<nums.length;k++){
if(tmp1[k]==nums[m]){
res[0]=k;
break;
}
}
//找到nums[n]在tmp1数组中的下标
for(int i=0;i<nums.length;i++){
if(tmp1[i]==nums[n]&&i!=k)
res[1]=i;
}
return res;
}

相关文章:

  • 关于模拟信道和数字信道根本区别的探讨
  • 常用maven - jar 下载与 安装
  • 国产可视化爬虫助力AI大模型训练:精准爬取汉语词典
  • cv2函数实践-图像处理(中心外扩的最佳RoI/根据两个坐标点求缩放+偏移后的RoI/滑窗切片/VOC的颜色+调色板)
  • 顶点着色技术在AI去衣中的作用
  • OJ1230进制的转换
  • HarmonyOS鸿蒙学习笔记(27)resources目录说明
  • 前端Vue小兔鲜儿电商项目实战Day03
  • [DDR5 Jedec 4-1] 预充电命令 Precharge
  • 数据结构 实验 1
  • 解决torch.cuda.is_available()一直为false的问题
  • 0开篇-介绍
  • 经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
  • 【代码随想录训练营】【Day 38】【贪心-5】| Leetcode 435, 763, 56
  • 算法金 | 再见,支持向量机 SVM!
  • ES6简单总结(搭配简单的讲解和小案例)
  • JAVA多线程机制解析-volatilesynchronized
  • mac修复ab及siege安装
  • Node 版本管理
  • Redash本地开发环境搭建
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Xmanager 远程桌面 CentOS 7
  • 记一次和乔布斯合作最难忘的经历
  • 模型微调
  • 巧用 TypeScript (一)
  • 微信小程序:实现悬浮返回和分享按钮
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 详解NodeJs流之一
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (3)选择元素——(17)练习(Exercises)
  • (AngularJS)Angular 控制器之间通信初探
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (定时器/计数器)中断系统(详解与使用)
  • (二)c52学习之旅-简单了解单片机
  • (二)构建dubbo分布式平台-平台功能导图
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十五)使用Nexus创建Maven私服
  • (推荐)叮当——中文语音对话机器人
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)jQuery 基础
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .net 7 上传文件踩坑
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET序列化 serializable,反序列化
  • .sys文件乱码_python vscode输出乱码
  • @JsonFormat与@DateTimeFormat注解的使用