题目来源: 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:
-
时间复杂度:,其中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)。主要为排序的空间复杂度。