两数之和
题号 167
给你一个下标从 1 开始的整数数组 numbers
,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target
的两个数。如果设这两个数分别是 numbers[index1]
和 numbers[index2]
,则 1 <= index1 < index2 <= numbers.length
。
以长度为 2 的整数数组 [index1, index2]
的形式返回这两个整数的下标 index1
和 index2
。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int left = 0;
int right = numbers.size()-1;
int s = 0;
while (true){
s = numbers[left] + numbers[right];
if (s == target){
break;
}
if (s > target){
right -= 1;
}
else{
left += 1;
}
}
return {left+1,right+1};
}
};
C++中不能直接使用方括号[]
来创建返回的向量(vector)。
三数之和
题号 15
给你一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请你返回所有和为 0
且不重复的三元组。
注意:答案中不可以包含重复的三元组。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int n = nums.size();
vector<vector<int>> ans;
sort(nums.begin(),nums.end());
for (int i = 0;i<n-2;i++){
int x = nums[i];
if (i && nums[i]==nums[i-1]){
continue;
}
int j = i+1;
int k = n-1;
while(j<k){
int sum = x + nums[j] +nums[k];
if (sum >0){
k--;
}
else if(sum <0){
j++;
}
else{
ans.push_back({nums[i],nums[j],nums[k]});
for(j++;j<k && nums[j]==nums[j-1];j++);
for(k--;j<k && nums[k]==nums[k+1];k--);
}
}
}
return ans;
}
};
思路和上一道题一样有两个优化的思路