力扣算法题Day1
题目: 给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
1 2 3 输入:nums = [2 ,7 ,11 ,15 ], target = 9 输出:[0 ,1 ] 解释:因为 nums[0 ] + nums[1 ] == 9 ,返回 [0 , 1 ] 。
示例 2:
1 2 输入:nums = [3 ,2 ,4 ], target = 6 输出:[1 ,2 ]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
**进阶:**你可以想出一个时间复杂度小于 O(n2)
的算法吗?
方法1:
1 . 暴力循环法
遍历每个元素x,并依次往后查找是否存在一个值与target - x相等。代码示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution {public : vector<int > twoSum (vector<int >& nums, int target) { int x = 0 ; int y = 0 ; vector<int > index; for (int i = 0 ; i < nums.size (); i++) { x = nums[i]; for (int j = i + 1 ; j < nums.size (); j++) { y = nums[j]; if (x + y == target) { index.push_back (i); index.push_back (j); break ; } } } return index; } };
算法复杂度分析 : 时间复杂度:O(n^2),空间复杂度:O(1) 对于每个元素,通过遍历数组寻找所对应的目标元素,这将耗费 O(n) 的时间,因此时间复杂度为 O(n^2)。
2 . 两遍哈希表
先将每个元素装入哈希表中,然后循环去查找每个元素x的对应目标元素(target-x)是否在表中,还要注意目标元素不能是元素本身 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Solution {public : vector<int > twoSum (vector<int >& nums, int target) { std::map<int , int > map; vector<int > result; for (int i = 0 ; i < nums.size (); i++) { map[nums[i]] = i; } for (int i = 0 ; i < nums.size (); i++) { int complement = target - nums[i]; if (map.find (complement) != map.end () && map[complement] != i) { result= {i, map[complement]}; } } return result; } };
算法复杂度分析 : 时间复杂度:O(n),空间复杂度:O(n) 包含有 n 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1) ,所以时间复杂度为 O(n)。 所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 n 个元素,所以空间复杂度为 O(n)。
3.一遍哈希表
在进行将元素插入到表中的同时,同时检查表中是否已经存在当前元素所对应的目标元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Solution {public : vector<int > twoSum (vector<int >& nums, int target) { std::map<int , int > map; vector<int > result; for (int i = 0 ; i < nums.size (); i++) { int complement = target - nums[i]; if (map.find (complement) != map.end () && map[complement] != i) { result= {i, map[complement]}; } map[nums[i]] = i; } return result; } };
算法复杂度分析 : 时间复杂度:O(n),空间复杂度:O(n) 这次对n个元素列表进行了一次循环遍历。所以时间复杂度为 O(n)。 该表中存储了 n 个元素,所以空间复杂度为 O(n)。