(2)中等
※1、最接近的三数之和
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在恰好一个解。
示例 1:
输入:nums = [-1,2,1,-4], target = 1 输出:2 解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
- 思路:
-
- 1、先对数组进行排序,然后使用双指针进行空间优化(避免程序超时)
- 2、注意去重,每次更新abc三个数的指针时,都要确认更新后的与更新前的数值不同
- 3、进行遍历,比较每次三数之和与目标target的数值差值的绝对值
- 解题:
-
- 1、先对数组进行排序:nums.sort()
- 2、首先确认一个数值a,使得b、c这两个元素和接近target-a;并且假设目前三数之和是数组范围内的最大数:best = 10**7
- 3、假设数组长度为n。
-
-
- 枚举a,其指针为i;
- 则设b的指针为i+1;c的指针为n-1
- 保证更新的a不与更新前相等
-
-
- 4、在不断枚举的过程中,使用s = nums[i] + nums[j] + nums[k],判断s与target的情况
-
-
- (1)判断是否已经是目标值
-
-
-
-
- if s == target:
- 说明找到了与 target 最接近的三数之和
-
-
-
-
- (2)是否更新best的值,以best作为最终返回值
-
-
-
-
- if abs(s - target) < abs(best - target):
- 说明best的值距离真正的target过远,需要更新target=s
-
-
-
-
- (3)判断s在target左边还是右边
-
-
-
-
- if s > target:
-
-
-
-
-
-
- 说明三数之和s在target右边
- c的指针左移,(n-1)-=1
- 去重:while j < k and nums[k] == nums[k+1]:
-
-
-
-
-
-
-
-
- k -= 1
- 保证更新后的数不会与之前的数相同(降低复杂度)
-
-
-
-
-
-
-
- else
-
-
-
-
-
-
- 说明三数之和s在target左边
- b的指针右移,(i+1)+=1
- 去重:while j < k and nums[j] == nums[j-1]:
-
-
-
-
-
-
-
-
- j += 1
-
-
-
-
class Solution(object):
def threeSumClosest(self, nums, target):
nums.sort()
best = 10**7 # 10的7次方;题目中提示:-10**4 <= target <= 10**4
n = len(nums)
# 枚举a
for i in range(n):
# 保证和上一次枚举的元素不相等,且从第下标为1开始,故限制i>0
if nums[i] == nums[i-1] and i>0:
continue
# 使用双指针枚举 b 和 c
j, k = i+1, n-1
while j<k:
s = nums[i] + nums[j] + nums[k]
# 如果和为 target 直接返回答案
if s == target:
return s
# 根据差值的绝对值来更新答案
if abs(s-target) < abs(best-target):
best = s
# 如果和小于 target,移动 b 对应的指针
if s < target:
j += 1
# 移动到下一个不相等的元素
while j<k and nums[j] == nums[j-1]:
j+=1
else:
# 如果和大于 target,移动 c 对应的指针
k -= 1
# 移动到下一个不相等的元素
while k>j and nums[k] == nums[k+1]:
k-=1
return best
2、最大数(map()函数的使用)
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 2:
输入:nums = [3,30,34,5,9]
输出:"9534330"
- 思路:
-
- 1、首先将数组从大到小排序,使用 nums.sort(reverse = True)
- 2、排序完后判断数组内是否全是0
- 3、将数组内的元素转为str类型(方便后续两个数字进行组合),并重新存入列表nums中
- 4、开始循环,j=i+1;比较i和两个数组合起来的大小
-
-
- (1)、如果[i]+[j] < [j]+[i]
-
-
-
-
- 说明需要调换两者位置,使组合后的数值最大
- j+=1
- 跳出循环
-
-
-
-
- (2)、如果[i]+[j] < [j]+[i]
-
-
-
-
- j+=1,比较i与i+2位置
-
-
-
- 5、将列表nums中的数全部组合起来
class Solution(object):
def largestNumber(self, nums):
n = len(nums)
s = ""
nums.sort(reverse = True)
if nums[0] == 0:
return "0"
nums = list(map(str, nums)) # 将数组内的元素转为str类型,并重新存入列表nums中
for i in range(n):
j = i+1
while j<n :
if nums[i]+nums[j] < nums[j]+nums[i]:
nums[i], nums[j] = nums[j], nums[i]
j += 1
continue
j += 1
for a in range(n):
s = s + nums[a]
return s