遍历整数数组 nums,使用整数 k 记录符合条件的最大整数,假设当前访问的元素为 x,如果 -x 存在于整数数组 nums 中,我们使用 x 更新 k。(不需要判断 x 的正负,因为一对相反数都会被用来更新 k)
[sol1-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution { public: intfindMaxK(vector<int>& nums){ int k = -1; for (auto x : nums) { auto p = find(nums.begin(), nums.end(), -x); if (p != nums.end()) { k = max(k, x); } } return k; } };
[sol1-Python3]
1 2 3 4 5 6 7 8
classSolution: deffindMaxK(self, nums: List[int]) -> int: k = -1 for x in nums: if -x in nums: k = max(k, x) return k
[sol1-Java]
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution { publicintfindMaxK(int[] nums) { intk= -1; for (int x : nums) { for (int y : nums) { if (-x == y) { k = Math.max(k, x); } } } return k; } }
[sol1-C#]
1 2 3 4 5 6 7 8 9 10 11 12 13
publicclassSolution { publicintFindMaxK(int[] nums) { int k = -1; foreach (int x in nums) { foreach (int y in nums) { if (-x == y) { k = Math.Max(k, x); } } } return k; } }
[sol1-Golang]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
funcmax(a, b int)int { if a > b { return a } return b }
funcfindMaxK(nums []int)int { k := -1 for _, x := range nums { for _, y := range nums { if -x == y { k = max(x, k) break } } } return k; }
[sol1-C]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#define MAX(a, b) ((a) > (b) ? (a) : (b))
intfindMaxK(int* nums, int numsSize) { int k = -1; for (int i = 0; i < numsSize; i++) { int pos = -1; for (int j = 0; j < numsSize; j++) { if (nums[j] == -nums[i]) { pos = j; break; } } if (pos != -1) { k = MAX(k, nums[i]); } } return k; }
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11
var findMaxK = function(nums) { let k = -1; for (const x of nums) { for (const y of nums) { if (-x === y) { k = Math.max(k, x); } } } return k; };
复杂度分析
时间复杂度:O(n^2),其中 n 是整数数组 nums 的长度。
空间复杂度:O(1)。
方法二:哈希表
使用哈希表保存数组 nums 的所有元素,遍历整数数组 nums,使用整数 k 记录符合条件的最大整数,假设当前访问的元素为 x,如果 -x 存在于哈希表中,我们使用 x 更新 k。(不需要判断 x 的正负,因为一对相反数都会被用来更新 k)
[sol2-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution { public: intfindMaxK(vector<int>& nums){ int k = -1; unordered_set<int> s(nums.begin(), nums.end()); for (auto x : nums) { if (s.count(-x)) { k = max(k, x); } } return k; } };
[sol2-Python3]
1 2 3 4 5 6 7 8
classSolution: deffindMaxK(self, nums: List[int]) -> int: k = -1 s = set(nums) for x in nums: if -x in s: k = max(k, x) return k
[sol2-Java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution { publicintfindMaxK(int[] nums) { intk= -1; Set<Integer> set = newHashSet<Integer>(); for (int x : nums) { set.add(x); } for (int x : nums) { if (set.contains(-x)) { k = Math.max(k, x); } } return k; } }
[sol2-C#]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
publicclassSolution { publicintFindMaxK(int[] nums) { int k = -1; ISet<int> set = new HashSet<int>(); foreach (int x in nums) { set.Add(x); } foreach (int x in nums) { if (set.Contains(-x)) { k = Math.Max(k, x); } } return k; } }
[sol2-Golang]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
funcmax(a, b int)int { if a > b { return a } return b }
funcfindMaxK(nums []int)int { k, s := -1, map[int]struct{}{} for _, x := range nums { s[x] = struct{}{} } for _, x := range nums { if _, ok := s[-x]; ok { k = max(x, k) } } return k }
intfindMaxK(int* nums, int numsSize){ int k = -1; HashItem *cnt = NULL; for (int i = 0; i < numsSize; i++) { hashAddItem(&cnt, nums[i]); } for (int i = 0; i < numsSize; i++) { if (hashFindItem(&cnt, -nums[i])) { k = MAX(k, nums[i]); } } hashFree(&cnt); return k; }
[sol2-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12 13
var findMaxK = function(nums) { let k = -1; const set = newSet(); for (const x of nums) { set.add(x); } for (const x of nums) { if (set.has(-x)) { k = Math.max(k, x); } } return k; };
复杂度分析
时间复杂度:O(n),其中 n 是整数数组 nums 的长度。
空间复杂度:O(n)。
方法三:排序 + 双指针
我们将数组 nums 从小到大进行排序,然后用指针 j 从大到小对数组 nums 进行遍历,同时用指针 i 从小到大查找值等于 -\textit{nums}[j] 的元素。因为 -\textit{nums}[j] 随 j 减小而增大,所以上一步获得的 i 值可以直接作为下一步的 i 值。
[sol3-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution { public: intfindMaxK(vector<int>& nums){ sort(nums.begin(), nums.end()); for (int i = 0, j = nums.size() - 1; i < j; j--) { while (i < j && nums[i] < -nums[j]) { i++; } if (nums[i] == -nums[j]) { return nums[j]; } } return-1; } };
[sol3-Python3]
1 2 3 4 5 6 7 8 9 10 11
classSolution: deffindMaxK(self, nums: List[int]) -> int: nums.sort() i, j = 0, len(nums) - 1 while i < j: while i < j and nums[i] < -nums[j]: i += 1 if nums[i] == -nums[j]: return nums[j] j -= 1 return -1
[sol3-Java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution { publicintfindMaxK(int[] nums) { Arrays.sort(nums); for (inti=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; } }
[sol3-C#]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
publicclassSolution { publicintFindMaxK(int[] nums) { Array.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; } }
[sol3-Golang]
1 2 3 4 5 6 7 8 9 10 11 12
funcfindMaxK(nums []int)int { sort.Ints(nums) for i, j := 0, len(nums)-1; i < j; j-- { for i < j && nums[i] < -nums[j] { i++ } if nums[i] == -nums[j] { return nums[j] } } return-1 }
[sol3-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12
var findMaxK = function(nums) { nums.sort((a, b) => a - b); for (let 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; };