Heim  >  Fragen und Antworten  >  Hauptteil

Ein Java-Problem, das mithilfe eines Algorithmus gelöst wurde (Problem mit Hashmap)

Die erste Frage zu Leetcode: Mit dieser Methode kann eine O(n)-Komplexitätslösung erreicht werden

Die Frage erfordert ein int[], wie z. B. nums = [2, 7, 11, 15], und ein Ziel = 9.
Wenn es zwei Zahlen gibt, deren Summe der Zielwert ist, zum Beispiel nums[0] + nums[1] = 2 + 7 = 9
gibt [0, 1] zurück.

Bei der Verwendung der folgenden Lösung habe ich ein wenig Zweifel, das heißt, es wird eine neue Hashmap erstellt, ihr wird jedoch kein Wert zugewiesen. Wie erreichen Sie in diesem Fall die Fragenanforderungen?

public int[] twoSum(int[] numbers, int target) {
    int[] result = new int[2];
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int i = 0; i < numbers.length; i++) {
        if (map.containsKey(target - numbers[i])) {
            result[1] = i + 1;
            result[0] = map.get(target - numbers[i]);
            return result;
        }
        map.put(numbers[i], i + 1);
    }
    return result;
}
阿神阿神2702 Tage vor585

Antworte allen(3)Ich werde antworten

  • phpcn_u1582

    phpcn_u15822017-05-27 17:43:09

    for循环里面的map.put()不是赋值吗???

    Antwort
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-27 17:43:09

    题目是要求得两个数的和为目标值为给定值,那么一定要遍历至少两个数.
    (1)如果先初始化,花费算法时间O(n);然后再遍历查找到第一正确的值时,需要算法时间O(k), 0<k<n.总时间是O(n+k), 要判断是不是自己,如(10 = 5 + 5).
      这种情况实现是:

        1)先初始化map,
       2)遍历第一个数2, target - 2 = 9 - 2 = 7
      3)判断7也在map中,返回正确结果.
      注意:要遍历到第一个正确数

     
    (2)如果不县初始化,那么一定会遍历到第二个正确的数,才停止,算法时间为O(k)(1<k<=n).不用判断自己.
      这种情况实现是:

     1)遍历第一个数2, target - 2 = 9 - 2 = 7
     2)判断7是否在map,发现不在,把2加入map,继续遍历
     3)直到遍历到7, target - 7 = 9 - 7 = 2
     4)判断2在map,返回正确结果
     注意,要遍历到第二个正确数.

    Antwort
    0
  • 高洛峰

    高洛峰2017-05-27 17:43:09

    没有 Key 的情况下,HashMap.containsKey(Key) 返回的是 false 不包括 Key

        public boolean containsKey(Object key) {
            return getNode(hash(key), key) != null;
        }

    不会出现你所想的空指针错误。

    Antwort
    0
  • StornierenAntwort