leetcode_01 两数之和,在O(n)内实现(cpp,python)

题目

Alt

一、暴力法

采用两层for循环,遍历数组,对于每一个 n u m s [ i ] nums[i] nums[i]向后查找是否存在大小为 t a r g e t − n u m s [ i ] target-nums[i] targetnums[i]的数。
双层for循环时间复杂度为 O ( n 2 ) O(n^2) O(n2)

二、利用哈希表

1.思路

遍历所给 n u m s nums nums,将已遍历过的存储到一个哈希表中,数组的元素存储为哈希表的键,该元素在数组中的位置存储为哈希表的值。对于每一个 n u m s [ i ] nums[i] nums[i]在哈希表中寻找是否存在 t a r g e t − n u m s [ i ] target-nums[i] targetnums[i]的键。
利用哈希表进行寻找,每次查找的时间复杂度都是 O ( 1 ) O(1) O(1)

2.代码实现

C++

class Solution {
public:
    vector<int> twoSum(vector<int> &nums, int target) {
        unordered_map<int, int> idx; 
        for (int i = 0;; i++) { 
            auto it = idx.find(target - nums[i]);
            if (it != idx.end()) 
                return {it->second, i}; 
            idx[nums[i]] = i; 
        }
    }
};

首先创建一个哈希表,遍历时利用find()函数查找是否存在 t a r g e t − n u m s [ i ] target-nums[i] targetnums[i]的键,若存在,返回键值对 i t it it对应的值和键;若不存在,将当前元素及其位置以键值对的形式存储到哈希表中。

python

class Solution:
    def twoSum(self, nums, target):
        hashtable = dict()
        for i, num in enumerate(nums):
            if target - num in hashtable:
                return [hashtable[target - num], i]
            hashtable[nums[i]] = i
        return []

枚举获得数组元素 n u m num num及其位置 i i i,查找哈希表中的键是否存在 t a r g e t − n u m target-num targetnum,循环此操作。


总结

利用哈希表的特性可以将每次查找的时间复杂度从 O ( n ) O(n) O(n)降低到 O ( 1 ) O(1) O(1)

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值