题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
暴力循环 通用解
class Solution
{
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int>one;
for (int i = 0; i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
if (nums[i] + nums[j] == target) {
ans.push_back(i);
ans.push_back(j);
return one;
}
}
}
return one;
}
};
暴力算法时间复杂度O(n²),空间复杂度O(1)
HASH法
unordered_map数组构造映射,遍历nums[i]时,看target-nums[i]是否存在hash表中即可(这是另一位大佬的写法,时间空间双优化)
时间复杂度O(n),空间复杂度O(n)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;
unordered_map<int,int>hashmap;
for(int i=0;i<nums.size();i++){
if(hashmap[target-nums[i]]
&&hashmap[target-nums[i]]!=i+1){
//防止利用同个元素
ans.push_back(i);
ans.push_back(hashmap[target-nums[i]]-1);
return ans;
}
hashmap[nums[i]]=i+1;
//将hash表对应下标+1,防止处理下标为0的情况
}
return ans;
}
};
写在后边的话
如果你有幸翻到最后,那么你一定是在校生了,许多在校生都曾被老师推荐在力扣上去刷题,但是往往第一道题,就劝退了很多很多基础不够牢固的学生,大学时光很短,回忆起来也很干涩,当你展望未来想当一个优秀的程序员时,很多难题摆在你的眼前,比如操作系统,比如数据结构,比如力扣题,这可能是你打退堂鼓的第一步。但是永远不要气馁,因为这些题的本质是让你锻炼自己代码的逻辑思维能力,当你思路陷入死局时。你可以借鉴前者许多经验,写代码的初学者永远记住一句话,先模仿,后超越,在开展Leetcode刷题路之前,可以先把我专栏的数据结构吃透(持续更新中)不会就要多打,不会就要多练,愿你我共勉 —以此纪念2020年毕业的我