1. 两数之和 + 哈希表

1. 两数之和

LeetCode_1

题目描述

方法一:暴力法

package com.walegarrett.interview;

/**
 * @Author WaleGarrett
 * @Date 2021/3/1 12:21
 */

/**
 * 题目描述:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
 * 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
 * 你可以按任意顺序返回答案。
 */

/**
 * 方法一:暴力法
 */
public class LeetCode_1 {
    public int[] twoSum(int[] nums, int target) {
        int len = nums.length;
        for(int i=0; i<len; i++){
            int next = target - nums[i];
            for(int j=i+1; j<len; j++){
                if(nums[j] == next)
                    return new int[]{i, j};
            }
        }
        return new int[]{-1,-1};
    }
}

方法二:哈希表

  1. 为了避免两次遍历数组,可以使用一个哈希表存储前面出现过的值。
  2. 因为题目可以保证只有一种正确答案,所以不需要找出所有符合的答案。
  3. 只要遍历到当前元素时,哈希表中存在target-now的元素就说明已经找到了答案。
/**
 * 方法二:使用哈希表
 */
class LeetCode_1_2 {
    public int[] twoSum(int[] nums, int target) {
        int len = nums.length;
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i=0; i<len; i++){
            int next = target - nums[i];
            if(map.containsKey(next)){
                return new int[]{map.get(next), i};
            }
            map.put(nums[i], i);
        }
        return new int[]{-1,-1};
    }
}

复杂度分析

  • 时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。
  • 空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。
posted @ 2021-03-01 17:42  Garrett_Wale  阅读(112)  评论(0编辑  收藏  举报