给你一个 不包含 任何零的整数数组 nums
,找出自身与对应的负数都在数组中存在的最大正整数 k
。返回正整数 k
,如果不存在这样的整数,返回 -1
。
目录
using namespace std的优缺点(单纯想到,与此题无关)
方法一:(个人思路)
1.将数组排序,由小到大。
2.双向奔赴,设置i为第一个数,j为最后一个数,两者相加等于0时就是存在对应负数并且最大的正整数;若是在第i个位置的数和第j个数相加大于零,则右侧j减少,也就是j减1;相加小于零同理。
class Solution {
public:
int findMaxK(vector<int>& nums) {
sort(nums.begin(),nums.end());
int k = -1;
int i = 0, j = nums.size()-1;
while (i < j && nums[i] < 0) {
if (nums[i] + nums[j] == 0) {
k = nums[j];
break;
} else if (nums[i] + nums[j] < 0) {
i++;
} else if (nums[i] + nums[j] > 0) {
j--;
}
}
return k;
}
};
方法二:(官方题解)暴力枚举
1.思路:从头到尾遍历数组中的所有数,如果这个数的相反数也在数组中存在,则满足题目条件,和上一个数比较,输出最大值。
2.补充知识(本人初学者):
auto用法
auto是C++11引入的关键字
优点:
- 如果表达式的类型发生变化,包括函数返回类型变化时,它仍然可以正常工作。
- 性能:你可以保证没有类型转换。
- 可用性:你不用担心类型名的拼写和错误。
- 效率:你的编码可以更高效。
使用方法 :
- 在声明变量时,用 auto 代替类型,并指定一个初始化表达式。
- 你可以用 const, volatile, * , & , && 等修饰符来修改 auto 的含义。
- 编译器会根据初始化表达式来推断变量的类型。
使用 auto 时要注意的限制有:
- auto 不能和其他类型说明符混合使用。
- 使用 auto 声明的变量必须有初始化表达式。
- auto 不能用于声明类型或转换类型。
- auto声明的变量列表中的所有变量都要有初始化表达式。
class Solution {
public:
int findMaxK(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;
}
};
比如:在代码中的第一个auto---int,第二个auto---vector<int>::iterator;
using namespace std的优缺点(单纯想到,与此题无关)
using namespace std 是一种在 C++ 中使用标准库的简便方式,它可以让你省去在每次调用标准库中的函数或类型时写 std:: 的麻烦。(来自new bing)
使用 using namespace std 的优点有:
- 简洁:你可以直接写 cout, string, vector 等,而不用写 std::cout, std::string, std::vector 等。
- 便捷:你可以节省输入的时间和精力,避免拼写错误。
使用 using namespace std 的缺点有:
- 污染:你可能会不小心引入了一些和标准库同名的函数或类型,导致命名冲突或歧义。
- 不清晰:你可能会忘记某个函数或类型是来自于哪个命名空间,导致代码的可读性降低。
- 不灵活:你可能会想要在某些地方使用标准库中的函数或类型,而在其他地方使用自定义的或其他库中的函数或类型,这时候 using namespace std 就会带来不便。
因此,一般不建议全局使用using namespace std,而是在局部范围或者针对特定的函数使用using的声明。