原文连接git
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。github
你能够假设每一个输入只对应一种答案,且一样的元素不能被重复利用。数组
示例:markdown
给定 nums = [2, 7, 11, 15], target = 9网络
由于 nums[0] + nums[1] = 2 + 7 = 9 因此返回 [0, 1]oop
来源:力扣(LeetCode) 连接:leetcode-cn.com/problems/tw… 著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。post
func TwoSum(nums []int, target int) []int { m := map[int]int{} for i1, n1 := range nums { n2 := target - n1 i2, ok := m[n2] if ok { return []int{i2, i1} } m[n1] = i1 } return nil } 复制代码
递归spa
(defun two-sum (lst tar) (two-sum-helper lst tar 0 (find-num-index (cdr lst) (- tar (car lst)) 1))) (defun two-sum-helper (lst tar m n) (if (null lst) nil (if (numberp n) (list m n) (two-sum-helper (cdr lst) tar (+ m 1) (find-num-index (cdr lst) (- tar (car lst)) (+ m 2)))))) (defun find-num-index(lst tar n) (if (null lst) nil (if (eql tar (car lst)) n (find-num-index (cdr lst) tar (+ n 1))))) 复制代码
非递归code
(defun two-sum (lst tar) (let ((ht (make-hash-table)) (l (length lst)) (n nil)) (do ((i 0 (+ i 1))) ((> i l) nil) (setf n (gethash (- tar (car lst)) ht)) (if (numberp n) (return-from two-sum (list n i))) (setf (gethash (car lst) ht) i) (pop lst)))) 复制代码