[LeetCode]Two Sum

本文深入探讨了著名的TwoSum问题,并提供了两种不同的实现方法。一种使用两次循环,另一种则通过优化只使用一次循环来解决问题。文章还特别注意到了当目标值的一半出现在数组中时的特殊情况。

<span style="font-family:SimSun;">如雷贯耳的Two Sum,光听隔壁哥们店面别人就面了两遍,真到自己写的时候还是没能一遍通过,事非经过不知难!算法思想很简单,用一个HashMap把数字出现的位置记下来,但自己第一遍提交时忘了考虑同一个数等于target的一半的情况,比如target是6,numbers是{3, 2, 4},我返回了1,1, 这是不对的。 Accepted 答案如下,红色部分为忘了check的条件</span>

import java.util.Map;
import java.util.HashMap;

public class Solution {
  public int[] twoSum(int[] numbers, int target) {
    Map<Integer, Integer> hash = new HashMap<Integer, Integer>();
    for (int i = 0; i < numbers.length; i++){
      hash.put(target - numbers[i], i + 1);
    }
    for (int i = 0; i < numbers.length; i++){
      if (hash.get(numbers[i]) != null && hash.get(numbers[i]) != i + 1){       
        return new int[]{i +1, hash.get(numbers[i])};
      }
    }
    return new int[]{-1, -1};
  }
}

但是这个答案循环了两遍,其实官方给的答案可以一个循环搞定:

<pre name="code" class="java">public static int[] twoSum(int[] numbers, int target){
  Map<Integer, Integer> hash = new HashMap<Integer, Integer>();
  for (int i = 0; i < numbers.length; i++){
    int x = numbers[i];
    if (hash.containsKey(target - x)){
      return new int[]{hash.get(target -x) + 1, i + 1};
    }
    hash.put(x, i);
  }
  return new int[]{-1, -1};
}


不管怎样,第一题正式开始了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值