1.两数之和

作者: 第四单元 | 来源:发表于2018-03-30 19:41 被阅读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)));
        }
    
    
    

    相关文章

      网友评论

        本文标题:1.两数之和

        本文链接:https://www.haomeiwen.com/subject/jhtwcftx.html