学长说的好,“解决焦虑的根本途径是刷Leetcode”。
1. 两数之和
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路
由于是第一次刷题,数据结构基本都已经忘的差不多了,只记得最基础的树、链表之流,此题最关键的是解决如何寻找target - num[i]
在nums
中的位置,做题时没想到合适的解决办法,只能从最暴力的O(n2)下手。
如果将nums
中的全部元素求和,在区分两个相加数位置 最蠢 的情况下,会得到一个N* N的矩阵。在此基础上,不区分两个加数 第二蠢 的情况下,只取N* N矩阵的上三角矩阵(右上),会节省一半的运算量,但是时间复杂度仍然保持在O(n2)。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans(2); //此处可以不用额外定义一个vector
for(int i = 0; i < nums.size()-1; i++){
for(int j = i+1; j < nums.size(); j++){
if(nums[i] + nums[j] == target){
ans = {i, j};
return ans; //return {i, j};
}
}
}
return ans; //return {};
}
};
实际上这里问题的本质是寻找一种有键值关系数据结构,这里的利用键值关系来优化寻找target - num[i]
时间复杂度。之前一直认为Python中的字典的键值之间没有任何关系,在此悔过
Game Changer: Hash Table - 哈希表
哈希表是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。
有两种不同类型的哈希表:哈希集合和哈希映射。
哈希集合是集合数据结构的实现之一,用于存储非重复值。
哈希映射是映射数据结构的实现之一,用于存储(key, value)键值对。
在标准模板库的帮助下,哈希表是易于使用的。大多数常见语言(如Java,C ++ 和 Python)都支持哈希集合和哈希映射。
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/hash-table/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网友评论