题目描述
给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,但是数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
题解
Python
时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n):
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
records = dict() # key对应nums中的数据 value对应该值的索引
for index, value in enumerate(nums): # 通过枚举类型可以更方便地获取下标
if target - value in records: # 可在字典中找到另一个值
return [index, records[target - value]]
else: # 没有对应的另一个值 将当前值及其索引加入字典
records[value] = index
C
时间复杂度 O ( n 2 ) O(n^2) O(n2),空间复杂度 O ( 1 ) O(1) O(1):
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int *ans = (int *) calloc(2, sizeof(int)); //store these two numbers
*returnSize = 2;
for (int i = 0; i < numsSize; ++i) {
for (int j = i + 1; j < numsSize; ++j) {
if (nums[i] + nums[j] == target) {
ans[0] = i;
ans[1] = j;
return ans;
}
}
}
return ans;
}
C++
时间复杂度 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n),空间复杂度 O ( n ) O(n) O(n):
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int> records; // key对应nums中的数据 value对应该值的索引
for (int i = 0; i < nums.size(); ++i) {
auto iter = records.find(target - nums[i]);
if (iter != records.end()) {
// 可在map中找到另一个值
return {
i, iter->second};
} else {
records.emplace(nums[i], i); // 没有对应的另一个值 将当前值及其索引加入map
}
}
return {
};
}
};