📌  相关文章
📜  K 的最大值,使得 K 和 -K 都存在于给定索引范围内的数组中 [L, R](1)

📅  最后修改于: 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)$

总结

本题可以用暴力法和排序法,暴力法时间复杂度较高,排序法时间复杂度较低。