leetcode Two Sum问题

本文探讨了两数之和问题的两种不同场景及其解决方案。一种是数组无序的情况,通过哈希表实现快速查找;另一种是数组已排序的情况,采用双指针法提高效率。文章对比了两种方法的特点,并提供了详细的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • Two Sum I
  • Two Sum II - Input array is sorted

第1题 Two Sum I

题目要求:

给定一个整数数组,返回这两个数字的索引,使它们合计成一个特定的目标。
限定条件:
返回值为这两个数字的索引,索引从0开始
假定每个输入都只有一个解,且不能使用相同的元素两次

解决思路

由于数组有序,故采用对撞指针的方法。设置两个指针分别指向数组的头尾,当两个数的和大于给定的值时,右指针左移,小于时,左指针右移。这里需要注意的时,左指针必须小于右指针。

Java代码

    public int[] twoSum(int[] nums, int target) {
        int [] res = new int[2];

        HashMap<Integer,Integer> tm = new HashMap<>();

        for(int i =0;i<nums.length;i++){
            if(tm.containsKey(target - nums[i])){
                res[0]=tm.get(target-nums[i]);
                res[1]=i;

            }else{
                tm.put(nums[i],i);
            }
        } 
            return res;
    }

第167题Two Sum II

题目要求:

给定已按升序排序的整数数组,找到两个数字,使它们合计为特定的目标数字。

限定条件
返回值为这两个数字的索引,且该索引是从1开始
假定每个输入都只有一个解,且不能使用相同的元素两次
解决思路

由于数组可能无序,且要返回的是元素的索引。所以我想到的办法是利用Set集合建立一个查找表,遍历整个数组,每次放入一个新元素时,在表中查找是否有target - nums[i],如果存在则返回相应的索引,反之则继续遍历。

Java代码

public  int[] twoSum(int[] numbers, int target) {
    int[] arr = new int[2];

   int l = 0,r = numbers.length-1;
   while(l<r){
    if(numbers[l]+numbers[r]>target) r--;
    else if(numbers[l]+numbers[r]<target) l++;
    else{
        arr[0] = l+1;
        arr[1] = r+1;
        break;
    }
   }
   return arr;
}

一些思考

对比上述两个题目可以看出,需要解决的问题几乎一致,但是由于给定条件不一样,数组是否有序,导致解决问题的思路也不一样,一般来说,上述两种方法也是比较常见的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值