Это буквально один из самых распространенных вопросов интервью.
Ваше текущее решение имеет временную сложность O (N ^ 2) , что не хорошо, однако его пространственная сложность составляет O (1) , что хорошо.
Вот рабочая версия этого подхода:
fun findSumOfTwo(arr: IntArray, targetSum: Int): Pair<Int, Int> {
if (arr.size < 2) return Pair(-1, -1)
var sum: Int
for (i in 0..arr.size - 2) {
for (j in i + 1..arr.size - 1) {
sum = arr[i] + arr[j]
if (sum == targetSum) {
if (arr[i] < arr[j]) {
return Pair(i, j)
}
return Pair(j, i)
}
}
}
return Pair(-1, -1)
}
После кодирования чего-то похожего выше ваш интервьюер, скорее всего, попросит вас оптимизировать временную сложность до O (N) , (сложность пространства должна увеличиться до O (N) но это нормально, сложность времени важнее в большинстве случаев).
Вы можете сделать это, используя один проход, используя HashMap :
fun findSumOfTwo(arr: IntArray, targetSum: Int): Pair<Int, Int> {
if (arr.size < 2) return Pair(-1, -1)
var map = HashMap<Int, Int>()
for (i in 0..arr.size - 1) {
var complement = targetSum - arr[i]
if (map.containsKey(complement)) {
var complementIndex = map.get(complement)!!
if (arr[i] < complement) {
return Pair(i, complementIndex)
}
return Pair(complementIndex, i)
}
map.put(arr[i], i)
}
return Pair(-1, -1)
}
Примечание: два приведенных выше решения основаны на двух допущениях: 1) входной массив не отсортирован. 2) Если во входном массиве более одной действительной пары, возвращающей только одну действительную пару, то все в порядке.