卷三 · 代码与实践1 分钟阅读

leetcode题解1:两数之和

描述

该题来自于力扣第一题

给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

分析

如果原数组已经排好了序,这时可以使用左右双指针法,空间复杂度为O(1)O(1),时间复杂度为O(n)O(n);
但这里原数组无序,要想依然达到O(n)O(n)的时间复杂度,关键在于如何使用O(1)O(1)的时间复杂度在数组中查找元素并获取下标,这时自然会想到使用hash存储。
所以基本思路为:将原始数组存储为HashMap,之后只需遍历数组元素并查询数组中是否存在(目标值−-元素值)的元素,如果存在取出相应下标即可。此时空间复杂度为O(n)O(n),时间复杂度为O(n)O(n)。

代码

python3
python
class Solution:
    def twoSum(self, nums, target):
        item_idx_map = {}
        for i in range(len(nums)):
            # 获取另一个数的下标,如果不存在返回None
            j = item_idx_map.get(target - nums[i], None)
            if j is not None:
                return [i, j]
            else:
                item_idx_map[nums[i]] = i
        return []
c++
cpp
#include<vector>
#include<unordered_map>
using namespace std;

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> map;
        for (int i = 0; i < nums.size(); i++) {
            auto j = map.find(target - nums[i]);
            if (j != map.end()) {
                return {j->second, i};
            }
            else
                map[nums[i]] = i;
        }
        return {};
    }
};
java
java
import java.util.HashMap;

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        for(int i = 0; i < nums.length; i++){
            if(map.containsKey(target - nums[i])){
                return new int[]{map.get(target - nums[i]), i};
            }
            else {
                map.put(nums[i], i);
            }
        }
        return new int[]{};
    }
}

继续这个系列