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

题目

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

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

示例:

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

因为 nums0 + nums1 = 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 (numsi + numsj == 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 - numsi);

if(iter != map.end()) {

return {iter->second, i};

}

// 如果没找到匹配对,就把访问过的元素和下标加入到map中

map.insert(pair<int, int>(numsi, i));

}

return {};

}

};

复制代码
时间复杂度: O(n)
空间复杂度: O(n)

Java

//使用哈希表

public int\[\] twoSum(int\[\] nums, int target) {

int\[\] res = new int2;

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 - numsi; // 遍历当前元素,并在map中寻找是否有匹配的key

if(map.containsKey(temp)){

res1 = i;

res0 = map.get(temp);

break;

}

map.put(numsi, i); // 如果没找到匹配对,就把访问过的元素和下标加入到map中

}

return res;

}

//使用双指针

public int\[\] twoSum(int\[\] nums, int target) {

int m=0,n=0,k,board=0;

int\[\] res=new int2;

int\[\] tmp1=new intnums.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(numsi+numsj<target)

i++;

else if(numsi+numsj>target)

j--;

else if(numsi+numsj==target){

m=i;

n=j;

break;

}

}

//找到numsm在tmp1数组中的下标

for(k=0;k<nums.length;k++){

if(tmp1k==numsm){

res0=k;

break;

}

}

//找到numsn在tmp1数组中的下标

for(int i=0;i<nums.length;i++){

if(tmp1i==numsn&&i!=k)

res1=i;

}

return res;

}

相关推荐
邵奈一21 分钟前
GPT-6.1 Terra速度是Sol的3倍,价格减半
算法
RaaS10021 分钟前
Node.js Brotli RCE 漏洞自查指南:fetch、undici、axios 都在影响面,三分钟确认你的版本
人工智能·深度学习·算法
shehuiyuelaiyuehao36 分钟前
算法56,重排链表
数据结构·算法·链表
qq_452396231 小时前
第四篇:《索引原理与实战:B-tree、Hash、GIN、GiST、BRIN》
算法·哈希算法·gin
西索斯coding2 小时前
Qwen3-Max 与 Qwen-Plus:60 个真实修复任务评测方案
大数据·网络·算法·ai
INGNIGHT2 小时前
440 · 背包问题(三)(无限次数)
算法·leetcode·动态规划
suhan2 小时前
【数据结构】七、查找:1.查找的概念、线性结构查找(顺序、折半(二分)、插值、稠密、分块、倒排)
数据结构·算法·排序算法
killerbasd3 小时前
总结 10.26
算法
深圳安锐科技有限公司3 小时前
从成像尺度到亚像素解算:变焦视觉位移监测如何让远近断面都稳
图像处理·人工智能·深度学习·算法·计算机视觉·系统架构·结构健康监测