题目描述
Given a sorted integer array without duplicates, return the summary of its ranges.
题目大意
给定一个有序数组,要求将数组中的数字按照连续数字进行分类表示,即前后连续的数字例如0,1,2,3表示为0->3 。
示例
E1
E2
解题思路
遍历一遍数组,利用两个指针进行前后比较,一个记录范围起始数字,另一个表示上一个数字,若仍然连续则将该指针递增,并继续下一个数字判断,否则将两个指针之内的数字表示为合适的字符串并记录在结果中。
复杂度分析
时间复杂度:O(N)
空间复杂度:O(1)
代码
class Solution { public: vector<string> summaryRanges(vector<int>& nums) { long n = nums.size(), sta = 0, last = 0; vector<string> res; if(n <= 1) { if(n == 1) insert(res, nums[0], nums[0]); return res; } sta = nums[0]; last = nums[0]; for(int i = 1; i < n; ++i) { // 若前后依然连续,则将last指针递增为当前数字 if(nums[i] - last == 1) last = nums[i]; // 若不连续,则把sta和last两个数字表示为合适的字符串加入结果中,并将sta和 // last重新赋值 else { insert(res, sta, last); sta = nums[i]; last = nums[i]; } } // 由于遍历到最后没有计算最后一段范围,将最后一段范围加入结果中 insert(res, sta, last); return res; } // 将两个数字的范围表示为字符串,并记录到结果中 void insert(vector<string>& res, long sta, long last) { string a = "", b = ""; // 用来表示两个数字是否为正数 bool f1 = true, f2 = true; // 若其中有数字为负数,应进行将其转为正数方便计算 if(sta < 0) { a += '-'; sta = -sta; f1 = false; } if(last < 0) { b += '-'; last = - last; f2 = false; } // 若两个数字相同,表示该范围内只有一个数字 if(sta == last) { if(sta) while(sta) { a.insert(f1 ? 0 : 1, 1, '0' + sta % 10); sta /= 10; } else a += '0'; res.push_back(a); } // 否则,该范围内至少有两个数字 else { if(sta) while(sta) { a.insert(f1 ? 0 : 1, 1, '0' + sta % 10); sta /= 10; } else a += '0'; if(last) while(last) { b.insert(f2 ? 0 : 1, 1, '0' + last % 10); last /= 10; } else b += '0'; res.push_back(a + "->" + b); } } };