來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/3sum-closest
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有袍榆。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán)或杠,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處敏储。
題目
給定一個(gè)包括 n 個(gè)整數(shù)的數(shù)組 nums 和 一個(gè)目標(biāo)值 target。找出 nums 中的三個(gè)整數(shù)盖腕,使得它們的和與 target 最接近妨退。返回這三個(gè)數(shù)的和。假定每組輸入只存在唯一答案锭魔。
例如例证,給定數(shù)組 nums = [-1,2迷捧,1织咧,-4], 和 target = 1.
與 target 最接近的三個(gè)數(shù)的和為 2. (-1 + 2 + 1 = 2).
方法一:三個(gè)for循環(huán)。太耗時(shí)
func threeSumClosest(_ nums: [Int], _ target: Int) -> Int {
if nums.count < 3 {
return 0
}
var maxSum = nums[0] + nums[1] + nums[2]
for i in 0..<nums.count - 2 {
for j in i+1..<nums.count - 1 {
for k in j+1..<nums.count {
let currentSum = nums[i] + nums[j] + nums[k]
if abs(maxSum - target) > abs(currentSum - target) {
maxSum = currentSum
}
}
}
}
return maxSum
}
方法二:一個(gè)for循環(huán)党涕,里面的兩個(gè)for循環(huán)變成兩個(gè)指針找
func threeSumClosest(_ nums: [Int], _ target: Int) -> Int {
if nums.count < 3 {
return 0
}
let sortNums = nums.sorted()
var resultSum = sortNums[0] + sortNums[1] + sortNums[2]
for i in 0..<sortNums.count - 2 {
var startIndex = i+1
var endIndex = sortNums.count - 1
while startIndex < endIndex {
let currentSum = sortNums[i] + sortNums[startIndex] + sortNums[endIndex]
if currentSum > target {
endIndex -= 1
}else {
startIndex += 1
}
if abs(resultSum - target) > abs(currentSum - target) {
resultSum = currentSum
}
if abs(resultSum - target) == 0 {
return resultSum
}
}
}
return resultSum
}