我刚刚开始迅速学习编码,并尝试使用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")
}
}
有人能这么善于解释代码吗?非常感谢。
答案 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)))