力扣1(java&python)-两数之和(简单)

题目:

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

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

哈希表:创建一个哈希表,从头开始遍历数组nums,对于每个值都判断哈希表中是否存在target-nums[i]这个key值,如果存在,这个说明找到了两个值,直接输出当前target-nums[i]所对应的位置value和当前的位置i,否则,将当前nums[i]和 i 加入到哈希表中。最终都没有找到,返回0。

注意:只需要一次遍历!!

两个元素x,y必然是一前一后出现的,如果存在符合条件的解,在遍历到x时,哈希表里没有符合的y,此时把x加入到了哈希表里,当遍历到y时,就可以在哈希表里找到对应的x了,所以只需要一次遍历。

java代码:

 1 class Solution {
 2     public int[] twoSum(int[] nums, int target) {
 3         //创建一个哈希表
 4         Map<Integer, Integer> map = new HashMap<>();
 5         for(int i = 0; i < nums.length; i++){
 6             //如果哈希表中存在target-nums[i],则获取它的下标
 7             if(map.containsKey(target - nums[i])){
 8                 return new int[]{map.get(target - nums[i]), i};
 9             }
10             //否则,把当前值存入哈希表中
11             map.put(nums[i], i);
12         }
13         return new int[0];
14     }
15 }

 python3代码:

1 class Solution:
2     def twoSum(self, nums: List[int], target: int) -> List[int]:
3         map = {}
4         for i,num in enumerate(nums):
5             if target - num in map:
6                 return [map[target - num], i]
7             map[num] = i

小知识:

python中的enumerate()函数:

enumerate()函数用于将一个可遍历的数据对象(如列表,元组或者字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

语法:

enumerate(sequence, [start=0])
# sequence 一个序列、迭代器或其他支持迭代对象
# [start=0] 下标起始返回值

例如:

nums = [2,6,9]
for t in enumerate(nums):
    print(t)
for index,num in enumerate(nums):
    print(index,num)
print(list(enumerate(nums)))
print(tuple(enumerate(nums)))

#  输出结果
(0, 2)
(1,6)
(2, 9)
0 2
1 6
2 9
[(0, 2), (1, 6), (2, 9)]
((0, 2), (1, 6), (2, 9))
posted on 2022-10-06 14:44  我不想一直当菜鸟  阅读(50)  评论(0编辑  收藏  举报