一、TwoSum返回下标
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].(返回数组下标)
思路:用哈希表降低时间复杂度
class Solution
{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
unordered_map<int, int> m;//哈希表
vector<int> result;
for (int i = 0; i < nums.size(); i++)
{
int tmp = target - nums[i];
if (m.find(tmp) != m.end())
{
result.push_back(i);
result.push_back(m[tmp]);
}
else
{
m[nums[i]] = i;
}
}
return result;
}
};
int main()
{
vector<int> v = {2,7,11,15,17};
Solution a;
vector<int> res = a.twoSum(v, 17);//返回的是vector的下标
for (int i : res)
{
cout << i << endl;
}
}
二、twoSum返回第几个数字
Input: numbers = [2,7,11,15], target = 9
Output: [1,2]
Explanation: The sum of 2 and 7 is 9. Therefore index1 = 1, index2 = 2.
思路:前后两个指针一起移动降低时间复杂度
class Solution
{
public:
vector<int> twoSum(vector<int>& nums,int target)
{
vector<int> result;
int p1 = 0;
int p2 = nums.size()-1;
while (p1 < p2)
{
if (nums[p1] + nums[p2] > target)
{
p2--;
}
if (nums[p1] + nums[p2] < target)
{
p1++;
}
result.push_back(p1 + 1);
result.push_back(p2 + 1);
return result;
}
return result;
}
};
三、BST树版本twoSum
思路:将BST树转换成vector容器
typedef struct TreeNode//BST树
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) :val(x), left(NULL), right(NULL)
{}
}TreeNode;
class Solution
{
public:
bool findTarget(TreeNode* root, int target)
{
vector<int> tmp;//用于存放结点的值
inorder(root, tmp);
int p1 = 0;
int p2 = tmp.size() - 1;
while (p1 < p2)
{
int sum = tmp[p1] + tmp[p2];
if (sum < target)
{
p1++;
}
if (sum > target)
{
p2--;
}
return true;
}
return false;
}
private:
void inorder(TreeNode* root, vector<int>& a)//把BST树转换成vector是从小到大的顺序
{
if (root == nullptr)
return;
inorder(root->left, a);
a.push_back(root->val);
inorder(root->right,a);
}
};