仅以此纪录每日LootCode所刷题目(偷个懒,写一道以前做过的题目)
题目描述:
示例:
?
思路:
在看到这道题的时候,首先想起的方法是暴力迭代法,这道题最后只需要输出和target最近的解,而不是分别输出三个数,因此这道题使用暴力迭代法求解时间和内存也不会超标(当然排名会靠后),因为是三个数的总和,因此我们首先建立一个列表将所有可能的三个数的总和存放在列表之中。之后我们在逐一求出每个总和数值与target目标值的插值(这里要取绝对值,因为我们无法判断他是在target的左面还是右面)。之后我们将列表进行一个sorted排序,得出最小的距离值。因为我们无法判断该值是在target的左面还是右面,因此我们得出两个可能解。最后我们需要判断哪个解在数组中(题目中假定只含有唯一解),在数组中的解就是最后的答案。
代码:
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
count = []
result = []
for i in range(len(nums)-2):
for j in range(i+1,len(nums)-1):
for k in range(j+1,len(nums)):
a =0
a = nums[i] + nums[j] + nums[k]
count.append(a)
if target in count:
return target
for i in range(len(count)):
a = 0
a = abs(count[i]-target)
result.append(a)
result = sorted(result)
if target + result[0] in count:
return target + result[0]
else:
return target - result[0]
?大神思路:
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums, r, end = sorted(nums), float('inf'), len(nums) - 1
for c in range(len(nums) - 2):
i, j = max(c + 1, bisect.bisect_left(nums, target - nums[end] - nums[c], c + 1, end) - 1), end
while r != target and i < j:
s = nums[c] + nums[i] + nums[j]
r, i, j = min(r, s, key=lambda x: abs(x - target)), i + (s < target), j - (s > target)
return r
明天更新 详细讲解一下这里的python函数用法。
|