题目链接:75. 和为S的两个数字
代码:
class Solution
{
public:
vector<int> findNumbersWithSum(vector<int> &nums, int target)
{
if (nums.size() < 1)
return {};
int n = nums.size();
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
{
if (nums[i] + nums[j] == target)
return {nums[i], nums[j]};
}
return {};
}
};
复杂度分析:
时间复杂度:O(n2),其中 n 是数组 nums 的长度。
空间复杂度:O(1)。
代码:
class Solution
{
public:
vector<int> findNumbersWithSum(vector<int> &nums, int target)
{
if (nums.size() < 1)
return {};
int n = nums.size();
unordered_set<int> uset;
for (const int num : nums)
{
if (uset.count(target - num))
return {num, target - num};
uset.insert(num);
}
return {};
}
};
复杂度分析:
时间复杂度:O(n),其中 n 是数组 nums 的长度。
空间复杂度:O(n),其中 n 是数组 nums 的长度。
代码:
class Solution
{
public:
vector<int> findNumbersWithSum(vector<int> &nums, int target)
{
if (nums.size() < 1)
return {};
sort(nums.begin(), nums.end());
int left = 0, right = nums.size() - 1;
while (left < right)
{
if (nums[left] + nums[right] == target)
return {nums[left], nums[right]};
else if (nums[left] + nums[right] > target)
right--;
else
left++;
}
return {};
}
};
复杂度分析:
时间复杂度:O(nlogn),其中 n 是数组 nums 的长度。
空间复杂度:O(1)。
题目来源:76. 和为S的连续正数序列
双指针做法,用两个数 small 和 big 分别表示序列的最小值和最大值。
small 初始化为 1,big 初始化为 2。
如果从 small 到 big 的序列的和大于 S,则可以从序列中去掉较小的值,也就是增大 small,让序列区间减小。 相反,如果从 small 到 big 的序列的和小于 S,则可以增大 big,让序列总和变大。
因为序列至少要有 2 个数字,small 有上界 (1+S)/2。
代码:
class Solution
{
public:
vector<vector<int>> findContinuousSequence(int sum)
{
if (sum < 3)
return {};
vector<vector<int>> sequences;
int upper = (1 + sum) / 2;
int small = 1, big = 2;
int curSum = small + big;
while (small < upper)
{
if (curSum == sum)
sequences.push_back(getSequence(small, big));
while (curSum > sum && small < upper)
{
curSum -= small;
small++;
if (curSum == sum)
sequences.push_back(getSequence(small, big));
}
big++;
curSum += big;
}
return sequences;
}
// 辅函数 - 生成范围为 [begin, end] 的数组
vector<int> getSequence(int begin, int end)
{
vector<int> seq;
for (int i = begin; i <= end; i++)
seq.push_back(i);
return seq;
}
};
复杂度分析:
时间复杂度:O(n),其中 n 是 small 的范围,n = (1 + sum) / 2。
空间复杂度:O(1)。