TwoSum Swift解决方案

时间:2018-12-17 00:15:24

标签: swift sum

我刚刚开始迅速学习编码,并尝试使用TwoSum。

“给出一个整数数组,返回两个数字的索引,以便它们加起来成为一个特定的目标。

您可以假设每个输入都只有一个解决方案,并且您可能不会两次使用相同的元素。

示例:

给出数字= [2,7,11,15],目标= 9,

因为nums [0] + nums [1] = 2 + 7 = 9, 返回[0,1]。“

我从GitHub找到了一些我不理解的解决方案。

代码来自https://github.com/soapyigu/LeetCode-Swift/blob/master/Array/TwoSum.swift

class TwoSum {
    func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
        var dict = [Int: Int]()

        for (i, num) in nums.enumerated() {
            if let lastIndex = dict[target - num] {
                return [lastIndex, i]
            }
            dict[num] = i
        }
        fatalError("No valid outputs")
    }
}

有人能这么善于解释代码吗?非常感谢。

5 个答案:

答案 0 :(得分:0)

在方法中初始化的dict将输入中的数字存储为键,并将其索引存储为值。程序使用它来记住哪个号码在哪里。 dict可以告诉您“数字2位于索引0”之类的信息。

对于输入数组中索引num上的每个数字i,我们从num中减去target以找到我们需要的其他数字最多可添加target

现在我们有了所需的其他号码,我们通过搜索dict来检查是否已经看到过这样的号码。 if let lastIndex = dict[target - num]部分正在执行此操作。如果dict知道另一个数字位于哪个索引,则返回该索引和i

如果以前没有看到该数字,则将i记录在键num下的字典中,希望在以后的迭代中,我们可以找到一个添加到{{1 }},等于9。

答案 1 :(得分:0)

在Sweeper的出色答案中,他解释了dict的用途:它使您可以使用数组中的值来查找该值的索引。如果我们将其命名为indexes,将更明显地说明该字典的用途,并且此代码以更明确的方式构建相同的字典:

var indexes = [Int: Int]()

for index in 0..<array.count {
    let value = array[index]
    indexes[value] = index
}

然后,您会得到一个字典:

[2:0, 7:1, 11:2, 15:3]

您可以这样编写函数:

func twoSum(_ array: [Int], _ target: Int) -> [Int] {
    var indexes = [Int: Int]()

    for index in 0..<array.count {
        let value = array[index]
        indexes[value] = index
    }

    for index in 0..<array.count {
        let value = array[index]
        if let otherIndex = indexes[target - value],
           index != otherIndex {
            return [index, otherIndex]
        }
    }
    fatalError("Unable to match values")
}

这是做相同事情的漫长得多的方式(效率更低)。它遍历数组两次而不是一次,但是结果应该是相同的。

答案 2 :(得分:0)

给出一个整数数组,返回两个数字的指数,以便它们加起来成为一个特定的目标。

var arr:[Int] = []
func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
    var toggle = false
    for i in 0..<nums.count {
        for j in i+1..<nums.count {
            if toggle == false {
                if(nums[i]+nums[j]==target){
                    toggle = true
                    arr.insert(i, at: 0)
                    arr.insert(j, at: 1)
                    break
                }
            }
        }
    }
    return arr
}

示例:

给出数字= [2,7,11,15],目标= 9,

因为nums [0] + nums [1] = 2 + 7 = 9, 返回[0,1]。

答案 3 :(得分:0)

func twoSum(array: [Int], target: Int) -> [Int] {
    var dict = [Int:Int]()
    for (index, number) in array.enumerated() {
        let value = target - number 
        if let sum = dict[value] {
            return [sum, index]
        }
        dict[number] = index
    }
    return [0,0]
}
/*
array=[1, 2, 3] -> target=4
 enumerated() => [0,1], [1,2], [2,3]
 (i, n)
 v4 - 1 = 3
 s[3:0]
 s[3:0]
 v4 - 2 = 2
 s[2:0]
 s[2:1]
 v4 - 3 = 1
 s[1:1]
 s[1:2]
 output [0,2]
*/

答案 4 :(得分:0)

var numbers: [Int] = [1, 3, 6, 7, 7, 14, 12]
var target = 26
var result = [Int]()
for i in 0..<numbers.count {
    for j in i+1..<numbers.count {
        if numbers[i] + numbers[j] == target {
            print(numbers[i],numbers[j])
            result.append(i)
            result.append(j)
        }
        }
}
print(Array(Set(result)))