和为S的两个数字/和为S的连续正数序列

版权声明:欢迎去我的新家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;
	}
};

猜你喜欢

转载自blog.csdn.net/dongyanwen6036/article/details/84867071