📅  最后修改于: 2023-12-03 15:32:27.148000             🧑  作者: Mango
给定一个数组和两个整数 L 和 R,找到最大的 K,使得 K 和 -K 都在数组的索引范围 [L, R] 内。
输入:nums = [1, 2, 3, -4], L = 0, R = 3
输出:2
解释:最大的 K 是 2,因为在范围 [0,3] 中有 2 和其相反数 -2。
这道题可以用暴力法,遍历范围内的每一个数,然后找到它的相反数是否在范围内。
代码片段:
class Solution(object):
def Max_K(self, nums, L, R):
"""
:type nums: List[int]
:type L: int
:type R: int
:rtype: int
"""
res = -1
for i in range(L, R+1):
if -nums[i] in nums[L:R+1]:
res = max(res, abs(nums[i]))
return res
时间复杂度:$O(n^2)$
空间复杂度:$O(1)$
我们也可以先对数组排序,然后从数组两端开始向中间查找,如果相反数在范围内,就直接返回它。
代码片段:
class Solution(object):
def Max_K(self, nums, L, R):
"""
:type nums: List[int]
:type L: int
:type R: int
:rtype: int
"""
nums.sort()
left, right = L, R
res = -1
while left < right:
if nums[left] == -nums[right]:
if L <= left and right <= R:
res = max(res, abs(nums[left]))
left += 1
right -= 1
elif abs(nums[left]) > abs(nums[right]):
left += 1
else:
right -= 1
return res
时间复杂度:$O(nlogn)$
空间复杂度:$O(1)$
本题可以用暴力法和排序法,暴力法时间复杂度较高,排序法时间复杂度较低。