Leetcode第四单元的LeetCode题解

1.两数之和

2018-03-30  本文已影响7人  第四单元

题目

给定一个整数数列,找出其中和为特定值的那两个数。

你可以假设每个输入都只会有一种答案,同样的元素不能被重用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

思路

思路一:在leetcode上这道题用两重循环也能AC,但有没有更优的方案呢?
思路二:对于A+B=C,B = C - A。我们先确定A,再从数组中找B。而常用的查找方法
有二分查找、Hash等。这个题不适用二分查找,因为二分查找需要先排序,而本题要求
返回两个下标,排序后下标就乱了,否则需要专门想其他办法来维护原下标,不划算。
那么考虑HashMap。key为元素的值,value为下标。把数组元素依次put进map,每次计算
diff = target - nums[i],在map中查找diff,查找到则结束,否则把nums[i] i加入map。

代码

import java.util.Scanner;
import java.util.Arrays;
import java.util.HashMap;

public class Solution {
    public int[] twoSum(int[] nums,int target) {
        HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();

        for(int i = 0; i < nums.length; i++) {
            int diff = target - nums[i];
            if(map.containsKey(diff)) {
                return new int[] {map.get(diff),i};
            } else {
                map.put(nums[i],i);
            }
        }
        return null;
    }

      //测试
    public static void main(String[] args) {
        Solution solution = new Solution();
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        int target = scanner.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i++)
            arr[i] = scanner.nextInt();
        // System.out.println(solution.binarySearch(arr,11));
        System.out.println(Arrays.toString(solution.twoSum(arr,target)));
    }


上一篇下一篇

猜你喜欢

热点阅读