• 中文
    • English
  • 注册
  • 查看作者
  • 1. Two Sum

    一.  英文原题

    Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice.
    Example:

    Given nums = [2, 7, 11, 15], target = 9,
     
    Because nums[0] + nums[1] = 2 + 7 = 9,return [0, 1].

    二.  中文翻译

    给定一组整数数组,返回两个元素的下标,这两个元素相加后是一个特定的结果。您可以假设每次输入都有一个解决方案,但是同一个元素不允许使用两次。

    三.  个人理解

    就是给你一个整数数组,然后再给你一个整数,找出这个数组的哪两个数相加可以等于这个整数,然后返回这两个数的下标

    四.  遇到的问题

    1. 不知道该如何return[1,2]的格式

    2. 错误的以为键值对,必须是相互对应,其实可以相互转换

    3. 最初使用的是最笨的方法,,相当于暴力做法,暴力的做法很简单,嵌套两个for循环,循环遍历每个元素

    五.  解题思路

    1.Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复,value的值可以相同,所以通过指定的key就可以取出对应的value

    • 使用map

    • Map<K,V>

    • boolean containsKey(Object key) : 是否包含指定的Key

    • boolean containsValue(Object value) : 是否包含指定的Value

    • V get(Object key) 根据指定的key获取Value

    • V put(K key, V value) : 添加一个键值对到Map

    2.因为题目让求的是下标,但是map里的get方法是通键返回值 ,所以得把下标设成值,才能返回.如果把下标作为键 ,map却里没有通过值返回键的方法(因为map允许多个不同的键对应一个相同的对,所以map里不提供通过值返回键的方法),所以这道题应该把下标设置为值

    3.map不需要赋值也可以调用方法

    具体介绍:    点我查看

    六.  优质答案

    方法一:
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i], i);
        }
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (map.containsKey(complement) && map.get(complement) != i) {
                return new int[] { i, map.get(complement) };
                //get是根据获取值,如果上面是put(i,nums[i]的话这里就是根据下标,而且使用containskey更耗时)
            }
        }
        throw new IllegalArgumentException("No two sum solution");
    }
    方法二
    public class Solution {
       public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (map.containsKey(complement)) {
                return new int[] { map.get(complement), i };
            }
            map.put(nums[i], i);
        }
        throw new IllegalArgumentException("No two sum solution");
    }
        
    }

    七.  参考资料

  • 0
  • 0
  • 0
  • 2.5k
  • 墨台懿轩大虎子zjmarina

    请登录之后再进行评论

    登录
    单栏布局 侧栏位置: