Given a sorted integer array without duplicates, return the summary of its ranges.
For example, given [0,1,2,4,5,7]
, return ["0->2","4->5","7"].
class Solution {
public:
string itos(int num){
stringstream ss;
ss << num;
return ss.str();
}
//[start,end]
string rangeBuilder(int start,int end){
if(start < end){
return itos(start) + "->" + itos(end);
}else
return itos(start);
}
/*algorithm
use start,end to track the window of range
if nums[i] != nums[i-1]+1,reset start pointer
*/
vector<string> summaryRanges(vector<int>& nums) {
int start,end;
vector<string>result;
for(int i = 0;i < nums.size();i++){
if(i == 0)start = end = i;
else if(nums[i] != (nums[i-1] + 1)){
result.push_back(rangeBuilder(start,end));
start = end = i;
}else end = i;
}
if((end + 1) == nums.size())
result.push_back(rangeBuilder(start,end));
return result;
}
};
/*recursive version
*/
//[start,end) [0,1,2,4,5,7]
void summaryRangesSub(vector<int>&nums,int start,int end){
if(start >= end)return;
int i = start;
while((i+1) < end && (nums[i]+1) == nums[i+1])++i;
result.push_back(rangeBuilder(nums,start,i));
summaryRangesSub(nums,i + 1,end);
}
vector<string>result;
vector<string> summaryRanges(vector<int>& nums) {
summaryRangesSub(nums,0,nums.size());
return result;