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

题目

给定一个整数数组 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;

}

相关推荐
江畔柳前堤2 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore3 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考4 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX5 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面6 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号6 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽6 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI6 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者8 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者8 小时前
【征程6】校准量化中HistogramObserver解析
算法