day126 2441. 与对应负数同时存在的最大正整数

108 阅读2分钟

题目来源: 2441. 与对应负数同时存在的最大正整数

题目描述:

  • 描述: 给你一个 不包含 任何零的整数数组 nums ,找出自身与对应的负数都在数组中存在的最大正整数 k 。 返回正整数 k ,如果不存在这样的整数,返回 -1 。
  • 示例:
示例1:
输入:nums = [-1,2,-3,3]
输出:3

解释:3 是数组中唯一一个满足题目要求的 k 。

示例2:
输入:nums = [-1,10,6,7,-7,1]
输出:7

解释:数组中存在 1 和 7 对应的负数,7 的值更大。

思路

思路1 遍历整数数组nums,使用整数k 记录符合条件的最大整数,假设当前访问的元素为 x,如果−x 存在于整数数组nums 中,我们使用x 更新 k。(不需要判断x 的正负,因为一对相反数都会被用来更新 k)

具体实现1

class Solution {
    public int findMaxK(int[] nums) {
        int k = -1;
        for (int x : nums) {
            for (int y : nums) {
                if (-x == y) {
                    k = Math.max(k, x);
                }
            }
        }
        return k;
    }
}

复杂度分析1:

  • 时间复杂度:O(n2)O(n^2),其中n 是整数数组nums 的长度。

  • 空间复杂度:O(1)

思路2 使用哈希表保存数组nums 的所有元素,遍历整数数组nums,使用整数k 记录符合条件的最大整数,假设当前访问的元素为x,如果−x 存在于哈希表中,我们使用x 更新k。(不需要判断x 的正负,因为一对相反数都会被用来更新k) 具体实现1

class Solution {
    public int findMaxK(int[] nums) {
        int k = -1;
        Set<Integer> set = new HashSet<Integer>();
        for (int x : nums) {
            set.add(x);
        }
        for (int x : nums) {
            if (set.contains(-x)) {
                k = Math.max(k, x);
            }
        }
        return k;
    }
}

复杂度分析1:

  • 时间复杂度:O(n),其中n 是整数数组nums 的长度。

  • 空间复杂度:O(n)

思路3 我们将数组nums 从小到大进行排序,然后用指针j 从大到小对数组nums 进行遍历,同时用指针i 从小到大查找值等于−nums[j] 的元素。因为−nums[j] 随j 减小而增大,所以上一步获得的i 值可以直接作为下一步的i 值。

具体实现3

class Solution {
    public int findMaxK(int[] nums) {
        Arrays.sort(nums);
        for (int i = 0, j = nums.length - 1; i < j; j--) {
            while (i < j && nums[i] < -nums[j]) {
                i++;
            }
            if (nums[i] == -nums[j]) {
                return nums[j];
            }
        }
        return -1;
    }
}

复杂度分析3:

  • 时间复杂度:O(nlogn),其中 n 是整数数组nums 的长度。主要为排序的时间复杂度。
  • 空间复杂度:O(logn)。主要为排序的空间复杂度。