Easy
题目描述
给你一个不含任何零的整数数组 nums,找出其中最大的正整数 k,使得 -k 也在数组中存在。
返回正整数 k。如果不存在这样的整数,返回 -1。
示例 1:
输入:nums = [-1,2,-3,3]
输出:3
解释:3 是数组中唯一有效的 k。
示例 2:
输入:nums = [-1,10,6,7,-7,1]
输出:7
解释:1 和 7 都在数组中有对应的负值。7 的值更大。
示例 3:
输入:nums = [-10,8,6,7,-2,-3]
输出:-1
解释:不存在有效的 k,我们返回 -1。
提示:
1 <= nums.length <= 1000-1000 <= nums[i] <= 1000nums[i] != 0
解题思路
这道题要求找到最大的正整数 k,使得 -k 也在数组中存在。
解法分析:
哈希表解法:首先将所有数字存入哈希表,然后遍历数组中的每个正数,检查其对应的负数是否存在于哈希表中。记录满足条件的最大正数。
排序 + 双指针解法:先对数组排序,使用双指针分别指向数组两端。由于排序后负数在左侧,正数在右侧,可以通过移动指针来寻找互为相反数的数对。
集合解法:类似哈希表,但使用集合来存储数字,逻辑更简洁。
推荐解法: 哈希表解法,时间复杂度最优且代码简洁易懂。
核心思路是利用哈希表的 O(1) 查找特性,遍历所有正数,检查对应负数是否存在,同时维护找到的最大值。
代码实现
class Solution {
public:
int findMaxK(vector<int>& nums) {
unordered_set<int> numSet(nums.begin(), nums.end());
int maxK = -1;
for (int num : nums) {
if (num > 0 && numSet.count(-num)) {
maxK = max(maxK, num);
}
}
return maxK;
}
};
class Solution:
def findMaxK(self, nums: List[int]) -> int:
num_set = set(nums)
max_k = -1
for num in nums:
if num > 0 and -num in num_set:
max_k = max(max_k, num)
return max_k
public class Solution {
public int FindMaxK(int[] nums) {
HashSet<int> numSet = new HashSet<int>(nums);
int maxK = -1;
foreach (int num in nums) {
if (num > 0 && numSet.Contains(-num)) {
maxK = Math.Max(maxK, num);
}
}
return maxK;
}
}
var findMaxK = function(nums) {
const numSet = new Set(nums);
let maxK = -1;
for (const num of nums) {
if (num > 0 && numSet.has(-num)) {
maxK = Math.max(maxK, num);
}
}
return maxK;
};
复杂度分析
| 复杂度类型 | 哈希表解法 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(n) |
其中 n 为数组长度。时间复杂度为 O(n) 是因为需要遍历数组两次(一次建立哈希表,一次查找)。空间复杂度为 O(n) 用于存储哈希表。
相关题目
- . Two Sum (Easy)