与对应负数同时存在的最大整数
题目
**题目来源: **力扣2441。
给你一个 不包含 任何零的整数数组 nums
,找出自身与对应的负数都在数组中存在的最大正整数 k
。
返回正整数 k
,如果不存在这样的整数,返回 -1
。
思路
双指针算法。
将nums排序,使得向量递增。设置左右指针l与r,其中l指向最左元素(最小负数)、r指向最右元素(最大正数)。如果nums中元素的符号全部相同,则无答案(return -1);否则,将nums[l]与nums[r]相加(得res),将出现下面三种情况:
- res == 0 。此时r指向的则是与对应负数同时存在的最大整数,即答案。
- res > 0 。此时r指向元素大于l指向元素的绝对值,将r向左移动。
- res < 0 。此时r指向元素小于l指向元素的绝对值,将l向右移动。
代码
class Solution {
public:
int findMaxK(vector<int>& nums) {
int l = 0;
int r = nums.size() - 1;
sort(nums.begin(), nums.end());
// 全正(负)元素
if(nums[l]>0 || nums[r]<0) return -1;
//终止条件:
//1. l指向元素必须小于0 。
//2. r指向元素必须大于0 。
//3. l必须小于等于r,但是题目中有描述不包含0元素,等于号可去。
while(nums[l] <= 0 && nums[r] >= 0 && l <= r){
int res = nums[l] + nums[r];
if( res == 0 ) return nums[r];
else if( res > 0 ) --r;
else ++l;
}
// nums中没有两元素相加得0,无答案。
return -1;
}
};