1-两数之和
先看题目:
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
待作答函数:
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
坑:
- 由于咱们写的是自定义函数,没必要在函数内部声明变量内容:nums = [2, 7, 11, 15], target = 9等,但必须声明函数输出结果self的对象,即list对象 self = list()或self=[];
- 先遍历数组,得到第一个数a,然后再次遍历剩余的数组,确认target-a是否存在,切记再次遍历数组时又从头开始遍历;
- python中range(n)是得到[0,1,...,n-2,n-1]数组,第二次遍历剩余数组时注意剩余数组的index是否正确。
注意以上坑之后,那就开始写起来吧,答案仅供参考:
提交结果:
1、Python暴力解法
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
self = list()
for i, a in enumerate(nums):
temp_0 = target - a
for j, b in enumerate(nums[i+1::]):
if temp_0 == b :
self.append(i)
self.append(j+i+1)
return self
2、C++ 2遍HashMap
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int>a;
vector<int>ret(2,-1);
int len = nums.size();
for(int i = 0; i < len; i++){
a.insert(map<int, int>::value_type(nums[i], i));
}
for(int i = 0; i < len; i++){
if(a.count(target- nums[i]) && a[target-nums[i]] != i){
ret[0] = i;
ret[1] = a[target-nums[i]];
break;
}
}
return ret;
}
};
1、初始化哈希map,map<int,int>a,哈希表key、value类型均为int,key是nums[i],value是nums序号;
2、遍历nums,依次将元素nums[i],元素序号写入哈希表;
3、遍历nums,查找hashmap中是否有元素target-nums[i],并判断该元素是否与nums[i]序号重合;
3、C++ 1遍HashMap
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int>a;
vector<int>ret(2, -1);
for(int i = 0; i < nums.size(); i ++){
if(a.count(target-nums[i])){
ret[0] = a[target-nums[i]];
ret[1] = i;
break;
}
a[nums[i]] = i;
}
return ret;
}
};