Every day a leetcode
题目来源:228. 汇总区间
解法1:双指针+遍历
我们从数组的位置0出发,向右遍历。每次遇到相邻元素之间的差值大于1时,我们就找到了一个区间。遍历完数组之后,就能得到一系列的区间的列表。
在遍历过程中,维护下标begin和end分别记录区间的起点和终点(左闭右开),对于任何区间都有begin<end当得到一个区间时,根据begin和end的值生成区间的字符串表示:
- 当end=begin+1时,区间的字符串表示为nums[begin]
- 当end>begin+1时,区间的字符串表示为nums[begin]->nums[end-1]
代码:
/*
* @lc app=leetcode.cn id=228 lang=cpp
*
* [228] 汇总区间
*/
// @lc code=start
class Solution
{
public:
vector<string> summaryRanges(vector<int> &nums)
{
vector<string> ans;
string temp;
int len = nums.size();
int begin = 0, end = 1;
while (end <= len)
{
// 确定end的下标,得到的区间为[begin, end)
while (end < len && nums[end] == nums[end - 1] + 1)
end++;
// 单值区间
if (end == begin + 1)
{
// 字符串表示为nums[begin]
temp = to_string(nums[begin]);
ans.push_back(temp);
}
// 连续区间
else
{
// 区间的字符串表示为nums[begin]->nums[end-1]
temp = to_string(nums[begin]) + "->" + to_string(nums[end - 1]);
ans.push_back(temp);
}
// 更新区间指针
begin = end;
end += 1;
}
return ans;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中n是数组nums的长度。
空间复杂度:O(1),除了用于输出的空间外,额外使用的空间为常数。