版权声明:欢迎去我的新家https://www.jianshu.com/u/906a78709f1d https://blog.csdn.net/dongyanwen6036/article/details/84867071
1.和为S的两个数字,牛客网ac
其实同leetcode第一题两数之和一样,
双指针,从两边逼近。
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array, int sum) {
int left = 0, right = array.size() - 1;
int flag = 0;//标记存不存在两数满足和sum
int min_left, min_right;
vector<int>res;
if (right < 1)return res;
int minMulti = array[right] * array[right];
while (left<right)
{
if (array[left] + array[right] == sum)
{
flag = 1;
if (minMulti>array[left] * array[right])
{
min_left = array[left];
min_right = array[right];
minMulti = min_left*min_right;
}
left++;
right--;
}
else if (array[left] + array[right] < sum)
left++;
else
right--;
}
if (!flag)return res;
res.push_back(min_left);
res.push_back(min_right);
return res;
}
};
2.和为S的连续正数序列. 时间复杂度O(n)
相似的思路,双指针(滑动窗口方法)
当总和小于sum,大指针继续+
否则小指针+
class Solution {
public:
//滑动窗口,双指针
vector<vector<int>> FindContinuousSequence(int sum) {
vector<vector<int>>res;
if (sum <= 1)return res;
int begin = 1, end = 2;//和为正数,连续序列(至少两个数)
while (begin < end&& end <= sum / 2 + 1)
{
int SumCurr = (begin + end)*(end - begin + 1) / 2;//当前窗口和
if (SumCurr < sum)
end++;
else if (SumCurr>sum)
begin++;
else
{
vector<int>tempres;
int temp = begin;
while (temp != end+1)
tempres.push_back(temp++);
res.push_back(tempres);
begin++;
end++;
}
}
return res;
}
};