1.两数之和
链接:1.两数之和
难度:Easy
标签:数组、哈希表
简介:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
题解 1 - python
- 编辑时间:2023-01-21
- 执行用时:32ms
- 内存消耗:16MB
- 编程语言:python
- 解法介绍:哈希。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
m = defaultdict()
for i, num in enumerate(nums):
if target - num in m:
return [m[target- num], i]
m[num] = i
return []
题解 2 - javascript
- 编辑时间:2019-09-15
- 执行用时:232ms
- 内存消耗:34.8MB
- 编程语言:javascript
- 解法介绍:获取第一个 num 值后,用 target 减去求出对应值,使用 indexOf 判断该对应值是否在数组里。
var twoSum = function (nums, target) {
for (let i = 0; i < nums.length; i++) {
num1 = nums[i];
num2 = target - nums[i];
result = nums.indexOf(num2);
if (result > -1 && result !== i) {
return [i, result];
}
}
};
题解 3 - typescript
- 编辑时间:2021-07-22
- 执行用时:84ms
- 内存消耗:40.2MB
- 编程语言:typescript
- 解法介绍:二分查找。
function twoSum(nums: number[], target: number): number[] {
const list = new Array(nums.length)
.fill(0)
.map((_, i) => i)
.sort((a, b) => nums[a] - nums[b]);
for (let i = 0; i < nums.length; i++) {
const num = nums[list[i]];
const i2 = search(target - num, i + 1);
if (i2 !== -1) return [list[i], list[i2]];
}
return [];
function search(target: number, l: number): number {
let r = nums.length - 1;
while (l <= r) {
const mid = (l + r) >> 1;
const midNum = nums[list[mid]];
if (midNum < target) l = mid + 1;
else if (midNum > target) r = mid - 1;
else return mid;
}
return -1;
}
}
题解 4 - cpp
- 编辑时间:2021-12-20
- 执行用时:4ms
- 内存消耗:10.4MB
- 编程语言:cpp
- 解法介绍:哈希存储。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> m;
vector<int> ans;
for (int i = 0; i < nums.size(); i++) {
int num = nums[i];
if (m.count(target - num)) {
ans.push_back(m[target - num]);
ans.push_back(i);
return ans;
} else {
m[num] = i;
}
}
return ans;
}
};
题解 5 - typescript
- 编辑时间:2020-10-03
- 执行用时:84ms
- 内存消耗:40.2MB
- 编程语言:typescript
- 解法介绍:哈希储存下一值。
function twoSum(nums: number[], target: number): number[] {
const cache = new Map<number, number>();
for (let i = 0, l = nums.length; i < l; i++) {
const num = nums[i];
const nextI = cache.get(num);
if (nextI !== undefined) return [nextI, i];
const nextNum = target - num;
cache.set(nextNum, i);
}
return [];
}
题解 6 - javascript
- 编辑时间:2019-09-15
- 执行用时:68ms
- 内存消耗:35.2MB
- 编程语言:javascript
- 解法介绍:获取第一个 num 值后,判断该值是否存在 map 表中,若存在则说明有匹配项直接返回,若不存在则储存。
var twoSum = function (nums, target) {
let map = new Map();
for (let i = 0; i < nums.length; i++) {
if (map.has(nums[i])) {
return [i, map.get(nums[i])];
}
map.set(target - nums[i], i);
}
};
题解 7 - c
- 编辑时间:2021-11-30
- 执行用时:8ms
- 内存消耗:6.3MB
- 编程语言:c
- 解法介绍:创建下标数组后排序后二分。
int *gnums;
int comp(const void *a, const void *b){
return gnums[(*(int *)a)] - gnums[(*(int *)b)];
}
int bs(int *arr, int numsSize, int start, int num){
int m, l = start, r = numsSize - 1;
if (gnums[arr[l]] > num || gnums[arr[r]] < num) return -1;
while (l < r) {
m = (l + r) >> 1;
if (gnums[arr[m]] == num) {
l = m;
break;
}
if (gnums[arr[m]] > num) r = m - 1;
else l = m + 1;
}
return gnums[arr[l]] == num ? l : -1;
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
gnums = nums;
*returnSize = 2;
int *ans = (int *)malloc(sizeof(int) * 2);
int arr[numsSize];
for(int i = 0; i < numsSize; i++) arr[i] = i;
qsort(arr, numsSize, sizeof(int), comp);
for(int i = 0; i < numsSize; i++) {
int num1 = nums[arr[i]], num2 = target - num1;
int num2idx = bs(arr, numsSize, i + 1, num2);
if (num2idx == -1) continue;
if (arr[i] > num2idx) {
ans[0] = arr[num2idx];
ans[1] = arr[i];
} else {
ans[1] = arr[num2idx];
ans[0] = arr[i];
}
break;
}
return ans;
}
题解 8 - rust
- 编辑时间:2023-07-01
- 内存消耗:2.4MB
- 编程语言:rust
- 解法介绍:同上。
impl Solution {
pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
let mut m = std::collections::HashMap::<i32, usize>::new();
for i in 0..nums.len() {
match m.get_mut(&(target - nums[i])) {
Some(prev) => return vec![*prev as i32, i as i32],
None => {
m.insert(nums[i], i);
}
}
}
vec![]
}
}