|
| 1 | +// Brute-Force. DFS with Backtracking. TLE |
| 2 | +class Solution { |
| 3 | + func minPairSum(_ nums: [Int]) -> Int { |
| 4 | + var (minMaxSum, currentSums, usedIndexes) = (Int.max, [Int](), Set<Int>()) |
| 5 | + minPairSumDFSHelper(nums, &minMaxSum, ¤tSums, &usedIndexes) |
| 6 | + return minMaxSum |
| 7 | + } |
| 8 | + |
| 9 | + func minPairSumDFSHelper(_ nums: [Int], _ minMaxSum: inout Int, _ currentSums: inout [Int], _ usedIndexes: inout Set<Int>) { |
| 10 | + if usedIndexes.count == nums.count { |
| 11 | + minMaxSum = [currentSums.max()!, minMaxSum].min()! |
| 12 | + return |
| 13 | + } |
| 14 | + for (index, item) in nums.enumerated() { |
| 15 | + if !usedIndexes.contains(index) { |
| 16 | + usedIndexes.insert(index) |
| 17 | + for (index2, item2) in nums.enumerated() { |
| 18 | + if !usedIndexes.contains(index2) { |
| 19 | + usedIndexes.insert(index2) |
| 20 | + let currentSum = item + item2 |
| 21 | + currentSums.append(currentSum) |
| 22 | + minPairSumDFSHelper(nums, &minMaxSum, ¤tSums, &usedIndexes) |
| 23 | + currentSums.removeLast() // Backtrack |
| 24 | + usedIndexes.remove(index2) // Backtrack |
| 25 | + } |
| 26 | + } |
| 27 | + usedIndexes.remove(index) // Backtrack |
| 28 | + } |
| 29 | + } |
| 30 | + } |
| 31 | +} |
| 32 | + |
| 33 | +// Greedy with sorting. Accepted. Time: O(nlogn) |
| 34 | +class Solution { |
| 35 | + func minPairSum(_ nums: [Int]) -> Int { |
| 36 | + var (minMaxSum, sortedNums, j) = (Int.min, nums.sorted(), nums.count - 1) |
| 37 | + for i in 0..<(sortedNums.count / 2) { |
| 38 | + minMaxSum = [minMaxSum, sortedNums[i] + sortedNums[j]].max()! |
| 39 | + j -= 1 |
| 40 | + } |
| 41 | + return minMaxSum |
| 42 | + } |
| 43 | +} |
0 commit comments