问题导入
对于给定的数组,求出其整数范围。如果从集合表示的角度来看待问题的话,可以理解成将列举法转化为描述法。
一般求解
所给数组已经做好了升序排列,那么只用顺序遍历一次,把每一个连续的整数串用字符串返回即可。这种解法比较常规,时间复杂度为O(n),也没有什么额外的空间开销。class Solution { public: vector<string> summaryRanges(vector<int>& nums) { const int size_n = nums.size(); vector<string> res; if (size_n == 0) return res; for (int i = 0; i < size_n; ) { int start = i, end = i; while (end+1 < size_n && nums[end+1] == nums[end]+1) end++; if (end > start) { res.push_back(to_string(nums[start]) + "->" + to_string(nums[end])); } else { res.push_back(to_string(nums[start])); } i = end+1; } return res; } };
思维跳跃
一个连续的整数串,对应的就是一个字符串,我们可以给同一范围内的所有数标上一致的tag,最后返回出start和end即可。
substarct表示的是对应元素所在字符串的序号,而数理上它是numbers和indexes的差值。代码实现并不复杂,这里也就不做赘述。这种解法虽然并没有带来实质上的复杂度优化,但是对开放性的思维锻炼比较有益,具有一定的尝试价值。