leetcode——两数之和 I、II(167)(有序双指针+无序HashMap)

双指针与哈希映射在解决两数之和问题中的应用
这篇博客探讨了如何利用双指针技术和哈希映射来解决寻找数组中两个数之和等于特定目标值的问题。在有序数组中,采用双指针从两端向中间遍历;而在无序数组中,使用哈希映射存储每个元素及其索引,以高效地找到匹配项。这种方法避免了排序,提高了算法效率。

两数之和总结:

1、数组本身有序,用双指针(两边向中间夹)

2、数组无序(要求返回下标),则不适合先排序再双指针夹逼,而是用 HashMap 保存目标值。

public int[] twoSum(int[] numbers, int target) {
        //两数之和总结:1、数组本身有序,用双指针(两边向中间夹)2、数组无序(要求返回下标),则不适合先排序再双指针夹逼,而是用 HashMap 保存目标值。
        int[] result=new int[2];
        //双指针法
        int left=0,right=numbers.length-1;
        while(true){
            int sum=numbers[left]+numbers[right];
            if(sum==target){
                result[0]=left+1;
                result[1]=right+1;
                return result;
            }
            if(sum<target){
                left++;
            }else{
                right--;
            }
        }
        //return result;
        /*
        //可以用 hashMap 保存期待值这种做法的,但是这里用例有问题
        Map<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<numbers.length;i++){
            if(map.containsKey(numbers[i])){
                result[0]=map.get(numbers[i])+1;
                result[1]=i+1;
                return result;
            }else map.put(target-numbers[i],i);
        }
        return result;
        */
    }

 

<think>好的,用户想要了解LeetCode两数之和问题的Python解法。首先,我需要回忆这个题目的具体要求。题目是给定一个整数数组和一个目标值,找出数组中两个数的和等于目标值的索引。并且每个输入只有一个解,且不能重复使用同一个元素。 接下来,我应该考虑不同的解决方法。最直观的是暴力法,双重循环遍历所有可能的组合,这样时间复杂度是$O(n^2)$,虽然简单但效率不高。不过对于小规模数据可能适用。 然后,优化方法通常是用哈希表(字典)来存储已经遍历过的数值及其索引。这样可以在一次遍历中,检查当前元素的补数(目标值减当前元素)是否已经在字典中。如果存在,直接返回对应的两个索引,否则将当前元素存入字典。这种方法的时间复杂度是$O(n)$,空间复杂度也是$O(n)$,但空间换时间,效率更高。 然后,我需要检查用户提供的引用内容,看看是否有相关的代码示例。在引用[1]、[2]、[3]、[4]、[5]中,大部分都提到了使用字典来优化查找过程。例如,引用[1]中的代码通过一个字典记录已经遍历过的元素,每次检查补数是否存在,这样可以快速定位结果。 另外,用户可能还关心如何处理特殊情况,比如数组中有重复元素,或者没有解的情况。根据引用[4],代码在找不到解时会抛出异常,但题目保证有解,所以可能不需要处理这种情况。但实际编码时可能需要考虑返回空或者错误信息。 然后,我需要将思路整理成步骤,给出清晰的代码示例,并解释每一步的作用。同时,对比不同方法的时间复杂度,说明为什么哈希表方法更优。可能还需要提到输入数组是否有序的情况,比如如果数组是有序的,是否可以使用双指针法,如引用[5]提到的Two Sum II问题,但原题中数组是无序的,所以双指针可能不适用,需要先排序,但这会改变索引,需要额外处理。 最后,生成相关问题,帮助用户进一步学习,例如优化方法的应用场景、不同解法比较、处理重复元素的方法等。</think>### LeetCode两数之和Python解法 两数之和问题要求:给定整数数组`nums`和目标值`target`,找出**和等于目标值的两个不同元素的下标**,且每个输入保证存在唯一解。 #### 解法一:暴力枚举(时间复杂度$O(n^2)$) ```python def twoSum(nums, target): for i in range(len(nums)): for j in range(i+1, len(nums)): if nums[i] + nums[j] == target: return [i, j] ``` - **缺点**:效率低,仅适用于小规模数据 #### 解法二:哈希表优化(时间复杂度$O(n)$) 通过字典存储已遍历元素及其索引,实现快速查找: ```python def twoSum(nums, target): hashmap = {} for idx, num in enumerate(nums): complement = target - num if complement in hashmap: return [hashmap[complement], idx] hashmap[num] = idx ``` - **核心逻辑**:用字典记录每个元素的值和索引,只需一次遍历即可完成查找[^1][^3] - **优势**:时间复杂度降低到线性级别 #### 关键点解析 1. **字典的逆向使用**:通过存储`值→索引`映射,将查找时间从$O(n)$降为$O(1)$ 2. **索引顺序处理**:先检查补数是否存在再存入当前元素,避免重复使用同一元素 3. **唯一解保证**:题目约束确保无需处理无解情况[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值