一、两数之和(有序数组)
二、题目理解
只要判定 target = A[i] + A[j] 即可!
1、暴力枚举法
基本思想:
-当i=0, j=1, 2, 3, … n-1;
-当i=1, j= 2, 3, … n-1;
-当i=2, j= 3, … n-1;
…
也就是说,双重循环,当满足判定条件时,返回 (下标数+1) 即可!
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int n = numbers.size();
vector<int> newa(2, 0); // 定义一个大小为2,元素都为0的一维数组
for(int i=0; i < n-1; i++ ){
for(int j = i + 1; j<n; j++){
if(numbers[i] + numbers[j] == target)
{
// 找到target位置,存储在新定义数组中
newa[0] = i+1;
newa[1] = j+1;
}
}
}
return newa;
}
};
但是很明显,暴力枚举法超出时间限制。
2、二分查找法
考虑到题目中还有一个条件,就是针对的数组是 升序数组
, 那么就满足一个条件
此时即可考虑二分法。
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int n = numbers.size();
for(int i=0; i<n; i++){
int l =i+1, r = n-1;
while(l<=r){
int m = (r-l)/2 + l; // 重点是调控改变这个中间的数
int sum = numbers[m] + numbers[i];
if(sum == target){
return {i+1, m+1};
}
else if(sum > target)
r = m-1;
else
l = m+1;
}
}
return {-1, -1};
}
};
3、双指针法
遍历初始位置与最后位置,利用二分法的思想,依次将 sum==target进行对比,得到结果再看!
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int n = numbers.size();
int l = 0, r = n-1;
while(l<=r){
int sum = numbers[l] + numbers[r];
if(sum==target){
return {l+1, r+1};
}
else if(sum>target){
r--;
}
else
l++;
}
return {-1, -1};
}
};