1 题目
题目:两数和-大于目标值(Two Sum - Greater than target)
描述:给一组整数,问能找出多少对整数,他们的和大于一个给定的目标值。请返回答案。
lintcode题号——443,难度——medium
样例1:
输入: [2, 7, 11, 15], target = 24
输出: 1
解释: 11 + 15 是唯一的一对
样例2:
输入: [1, 1, 1, 1], target = 1
输出: 6
2 解决方案
2.1 思路
使用对向双指针的方式,两个指针分别从头尾开始向中间走,若指针指向的两个值的和大于目标值,则将左指针右移动的所有组合(必定大于目标值)加入结果,然后右指针往左一步;若两个值的和小于或等于目标值,则右指针往左一步,不断循环,直到找到结果。
2.2 时间复杂度
排序时间复杂度O(nlogn),查找的时间复杂度O(n),总时间复杂度为O(nlogn)。
2.3 空间复杂度
空间复杂度为O(1)。
3 源码
细节:
- 使用对向双指针的方式。
- 需要先进行排序。
- 找到符合条件的结果后,要将后续左指针右移的所有符合条件的组合都加入结果,因为left+right>target,则一定有(left右边的所有数)+right>target。
C++版本:
/**
* @param nums: an array of integer
* @param target: An integer
* @return: an integer
*/
int twoSum2(vector<int> &nums, int target) {
// write your code here
int result = 0;
if (nums.empty())
{
return result;
}
// 先对数组进行排序
sort(nums.begin(), nums.end());
int left = 0;
int right = nums.size() - 1;
while (left < right)
{
if (nums.at(left) + nums.at(right) > target)
{
result = result + (right - left); // left向右移的所有结果都小于目标值
right--;
}
else
{
left++;
}
}
return result;
}