法1: 暴力求解法
class Solution
{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
for(int i = 0; i < nums.size(); i++)
{
for(int j = i + 1; j <nums.size(); j++)
{
//双重循环判断 如果两数之和等于目标值 则返回
if(nums[i] + nums[j] == target)
{
nums.clear();
nums.push_back(i);
nums.push_back(j);
return nums;
}
}
}
return nums;
}
};
法2:二分求和算法
class Solution
{
//自定义排序规则算法 升序排序
struct Less
{
bool operator()(pair<int, int>&a, pair<int, int>&b)
{
return a.second < b.second;
}
};
public:
vector<int> twoSum(vector<int>& numbers, int target)
{
//定义键值对 一个存储值 一个存储位置信息
vector<pair<int, int>> number;
//按照顺序对容器内的数字进行压入
for (int i = 0; i < numbers.size(); i++)
{
number.push_back(make_pair(i, numbers[i]));
}
//调用排序算法,使其成为有序系列
sort(number.begin(), number.end(), Less());
//定义下标 从两边向中间靠近
int L = 0, R = numbers.size() - 1;
//当左边小标小于右边时进行循行判断
while (L < R)
{
//如果两数之和等于目标值
if (number[L].second + number[R].second == target)
{
int t1 = number[L].first;
int t2 = number[R].first;
vector<int> result{ min(t1,t2),max(t1,t2) };
return result;
}
//如果两数之和小于目标值 左下标右移 两数之和就会增大
if (number[L].second + number[R].second < target)
{
L++;
}
//如果两数之和大于目标值 右下标右移 两数之和就会减小
if (number[L].second + number[R].second > target) {
R--;
}
}
//如果不存在,返回-1,-1
vector<int> result{ -1,-1 };
return result;
}
};