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

题目

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

}

相关推荐
8Qi8几秒前
LeetCode 1049:最后一块石头的重量 II —— 题解 ✅
算法·leetcode·职场和发展·动态规划·01背包
wubba lubba dub dub75015 分钟前
第四十九周学习周报
人工智能·算法·机器学习
Java_2017_csdn42 分钟前
ComplexKeysShardingAlgorithm 小结
java·大数据·算法
海梨花1 小时前
快手面试高频算法题
java·算法·面试
lqqjuly1 小时前
超分辨率算法深度解析(Super-Resolution Algorithms)
算法
嵌入式老牛2 小时前
液晶段码(米/日字格)识别—倾斜校正
opencv·算法·仿射变换
luj_17682 小时前
残熵算法:风险缓冲与效率优化的融合
c语言·开发语言·网络·经验分享·算法
oddsand13 小时前
pgvector 三大相似度算法
人工智能·算法·机器学习
运筹vivo@3 小时前
LeetCode 2574. 左右元素和的差值
算法·leetcode·职场和发展·每日一题
计算机安禾3 小时前
【数据库系统原理】第4篇:关系数据结构的形式化定义:域、笛卡尔积与关系模式
数据结构·数据库·算法