LeetCode 1. Two Sum

LeetCode TwoSum题解
本文深入解析LeetCode经典题目TwoSum,探讨了暴力搜索、快速排序及HashMap三种解题策略,重点介绍了如何运用HashMap实现线性时间复杂度的解决方案,以提升查找效率。

LeetCode 1. Two Sum

一.题目分析
1.要点:
  • each input would have exactly one solution
  • not use the same element twice
2.散列

定义:将元素通过一个函数转换为整型,使该整数可以尽量唯一的代表该元素

例如:

m[nums[i]] = i;//可以体现散列的思想,用空间换时间

散列为什么能够加快查找速度呢? ?

假如:你去超市买4号物品,首先需要找到1号物品的位置,如果超市中的货物不存在存放表,那么当你需要寻找一样物品就需要遍历这个仓库。但如果超市中存在如下的货物存放表(相当于本题中的HashMap),那么你就可以在常数时间复杂度内找到你所要物品的位置。

1 二楼四号口

2 三楼四号口

3 一楼三号口

… …

3.解题思路
  • 暴力搜索:遍历所有的两个数字的组合,然后算其和,时间复杂度为O(N^2)
  • 快速排序:先使用快速排序,时间复杂度为O(n*logn),再分别在数组头尾设置两个标记,每次比较头尾两个数的和,如果比target小,头标记右移,如果大,尾标记左移。但需要注意记录快速排序前后数字的位置变化
  • HaspMap: 想用线性时间复杂度来解决问题,也就是说只遍历一个数字,而将另一个数字存储起来,使用一个HashMap来建立数字与其坐标位置之间的映射,而HashMap是常数级别的查找效率。故在遍历数组的时候,用target减去遍历得到的数字,就是另一个需要的数字,直接在HashMap中查找需要的数字即可。
二.相关代码
1.Python版本
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        numMap = {} #创建了一个空字典而并非空set  numMap = set()
        
        # for i in range(0,len(nums)):
        #     if target - nums[i] in numMap:
        #         return [ i , numMap[target - nums[i]]]
        #     else:
        #         numMap[nums[i]] = i
        
        # another version 利用pthon 内置enumerate函数,速度更快
        for i,item in enumerate(nums):
            complement = target - item
            if complement in numMap:
                return [i , numMap[complement]]
            else:
                numMap[item] = i
        
enumerate( )函数介绍
  • 作用对象:可遍历的数据对象(如列表、元组或字符串)
  • 作用:将数据对象组合为一个索引序列,同时列出数据下标和数据
#普通for 循环
i = 0
seq = ['one','two']
for element in seq:
    print(i,seq[i])
    i += 1
#for 循环使用enumerate
seq = ['one','two']
for i,item enumerate(seq):
    print(i,item)
#summary: 从中可看出,item表示的是数据,而不用再通过数据小标得到数据
2.C++ 版本
class Solution
{
public:
    vector<int> twoSum(vector<int> &nums, int target)
    {
        vector<int> res;
        unordered_map<int, int> m;

        //以要查找的数作为数组的下标来建立映射表
  
        for (int i = 0; i < nums.size(); i++)
        {
            int needed = target - nums[i];
            if (m.count(needed) && m[needed] != i) 
            {
                res.push_back(i);
                res.push_back(m[needed]);
                break ;
            }
            else
            {
                m[nums[i]] = i;
            }    
        }
        return res;
    }
}; 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值