01_两数之和

一、官方描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

二、官方示例

示例 1

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3

输入:nums = [3,3], target = 6
输出:[0,1]

三、官方提示

2 <= nums.length <= 103
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

四、编码实现

代码仓库

https://gitee.com/dianjiu/leetcode

https://github.com/dianjiu/leetcode

JavaScrept

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
    const map = new Map();
    for (let i = 0; i < nums.length; i++) {
        if (map.has(nums[i])) {
            return [map.get(nums[i]), i]
        }
        map.set(target - nums[i], i)
    }
}

Java

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

/*
 * @lc app=leetcode.cn id=1 lang=java
 *
 * [1] 两数之和
 */

// @lc code=start
class Solution {

    public static int[] twoSum(int[] nums, int target) {
        // 注意:数组是无序的
        int[] res = new int[2];
        Map<Integer, Integer> hashMap = new HashMap<>();
        // 便利数组
        for (int i = 0; i < nums.length; i++) {
            if (hashMap.containsKey(nums[i])) {
                res[0] = i;
                res[1] = hashMap.get(nums[i]);
                return res;
            }
            // 将数据的补数存为key,下标为value
            hashMap.put(target - nums[i], i);
        }
        return res;
    }

    public static void main(String[] args) {
        int[] arr = new int[] { 3, 2, 4 };
        int target = 6;
        int[] twoSum = twoSum(arr, target);

        System.out.println(Arrays.toString(twoSum));
    }
}
// @lc code=end

Go

func twoSum(nums []int, target int) []int {
	m := make(map[int]int)
	for i, v := range nums {
		if p, ok := m[v]; ok {
			return []int{p, i}
		}
		m[target-v] = i
	}
	return nil
}

五、性能对比

对比项目 JavaScript Java Go
内存消耗 mb 37.8 38.7 3
执行耗时 ms 88 0 4

六、最优答案

JavaScript

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    for(let i = 0; i < nums.length - 1; i++) {
        for (let j = i + 1; j < nums.length; j++) {
            if (nums[i] + nums[j] === target) {
                return [i, j];
            }
        }
    }
};

Java

class Solution {
    public int[] twoSum(int[] nums, int target) {
   int n=nums.length;
   for(int i=0;i<n;++i)
     for(int j=i+1;j<n;++j)
     {
      if(nums[i]+nums[j]==target)
         return new int[]{i,j};
     }  
     return new int[0]; 
   }
  
    }

Go

func twoSum(nums []int, target int) []int {
	a := make([]int, 2)
	c := len(nums)
	for i := 1; a[0] < c-1; i++ {
		if nums[i]+nums[a[0]] == target {
			a[1] = i
			return a
		}
		if i >= c-1 {
			a[0]++
			i = a[0]
		}
	}
	return []int{}
}

六、刷题总结

本想着用HashMap去解这道题,但是很多时候竟然没有双重for循环来的直接快速

上一篇:twoSum 问题


下一篇:Medium | LeetCode 15. 三数之和 | 双指针法