力扣1:两数之和
前言:不同于某些OJ,力扣第一题对初学者不是很友好,初次看到它,可能一时想不到思路——但须知万事开头难,走出第一步,即相当于成功一半——
而:我将为你认认真真地解开它ヾ(◍°∇°◍)ノ゙
关键词索引:哈希映射、BF、力扣第一题
目录:
题目描述:
给定一个整数数组 nums 和一个整数目标值 target ,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
题意补充:
示例1️⃣:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例2️⃣:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例3️⃣:
输入:nums = [3,3], target = 6
输出:[0,1]
提示💥:
思路|破解:
A解:BF蛮力枚举
思路标识:
- 1-》数据明确给出:数组的长度为 104 (程序员下意识地判断:这是一个相对较小的数)
- 2-》求两数之和,这意味这我们只需 两重循环 即可
- 3-》第一重:for i:0=>n-2,第二重:for j:i+1=>n-1,枚举出nums中数字的所有两两组合,遍历所有情况。
- 4-》时间复杂度为O(n2)
解题:
class Solution {
public:
vector<int>twoSum(vector<int>& nums, int target) {
for(int i=0;i<nums.size()-1;i++){
for(int j=i+1;j<nums.size();j++){
if(nums[i]+nums[j]==target)return {i,j};
}
}
return {};
}
};
B解:Hash哈希映射
思路标识:
- 1-》从A解中我们可以看到:第二重循环的实质无非是对 target-nums[i] 的 【查找】 ——
- 2-》对于 查找 操作,我们很容易想到 【哈希表】 ,通过 键值 可以快速查找到 它对应的值,哈希表最理想情况下的时间复杂度仅为O(1)
- 3-》将第二重循环变成哈希查找,可以极大地加快时间
解题:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int>hash;
for(int i=0;i<nums.size();++i){
unordered_map<int,int>::iterator it=hash.find(target-nums[i]);
if(it!=hash.end()){
return {it->second,i};
}
hash[nums[i]] = i;
}
return {};
}
};
动态图解o(* ^ ▽ ^ *)┛:
知识回顾:
- 对数据规模较小的问题,可以使用 蛮力枚举(BF)
- 哈希表(散列表),是根据关键码值(key)直接进行访问的数据结构。可以利用它,大大提高查找效率, 属于以空间换时间的典型策略
后记:
这样的题解我还是有点满意的(~ ̄▽ ̄)~ ,迈开第一步,就是新的开始,《解题者:力扣解题之路》现在算正式开始了。
愿我们一同努力,解破算法难题。