1.【两数之和】

Java

方法一 枚举法

思路:
采用双层循环遍历数组中的元素,找到符合题目要求的两数即可,若找不到则抛出异常。
代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int i,j;
        int len = nums.length;
        for(i = 0;i < len; i++){
            for(j = i+1;j < len; j++){
                if(nums[i]+nums[j] == target){return new int[] {i,j};}
            }
        }
    throw new IllegalArgumentException("no two numbers qualified");
    }
}

方法一很容易想到,也很容易理解,但是该方法时间复杂度为 O ( n 2 ) O(n^2) O(n2),我们希望减少一些时间复杂度,于是有了第二个方法。


方法二 使用哈希表

思路:
方法一中对于每一个 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 ( n 2 ) O(n^2) O(n2)的时间复杂度,这就促使我们思考:有没有什么方法可以快速寻找 t a r g e t − n u m s [ i ] target - nums[i] targetnums[i]?我们于是把目光投向了哈希表这一数据结构。
步骤:

  1. 建立一个初始长度为 n − 1 n-1 n1的哈希表;
  2. n u m s [ 0 ] nums[0] nums[0]放入;
  3. 遍历数组中的元素;
    • 对任意一个元素,若 t a r g e t − n u m s [ i ] target - nums[i] targetnums[i]在哈希表中,则直接返回(这里用 t e m p temp temp表示 t a r g e t − n u m s [ i ] target - nums[i] targetnums[i]),
    • t a r g e t − n u m s [ i ] target - nums[i] targetnums[i]不在哈希表中,则将这个元素放入哈希表;
  4. 遍历完成后,若没有符合条件的两数,则抛出异常
public static int[] twoSum(int[] nums, int target) {
            int n = nums.length;
            Map<Integer,Integer> hashtable = new HashMap<Integer,Integer>(n-1);
            int i;
            hashtable.put(nums[0],0);
            for(i = 1;i < n; i++){
                int temp = target - nums[i];
                if(hashtable.containsKey(temp)) {
                    return new int[] {i,hashtable.get(temp)};}
                hashtable.put(nums[i],i);
            }
            throw new IllegalArgumentException("no two numbers qualified");
        }
    }

由于哈希表查找速度为 O ( 1 ) O(1) O(1),所以该方法是 O ( n ) O(n) O(n)的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值