• 中文
    • English
  • 注册
  • 赞助本站

    • 支付宝
    • 微信
    • QQ

    感谢一直支持本站的所有人!

    • 查看作者
    • 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");
      }
          
      }

      七.  参考资料

    • 3
    • 0
    • 0
    • 1.7k
    • 墨台懿轩大虎子zjmarina

      请登录之后再进行评论

      登录
    • 做任务
    • 实时动态
    • 偏好设置
    • 返回顶部
    • 单栏布局 侧栏位置: