どうも、たくチャレ(@takuchalle)です。
LeetCodeの228. Summary Rangesを解いてみました。
昇順に整列済みの数列が与えられます。連続する数列をx -> y
という形式 のリストを返す問題。数列の要素数が1の時はx
のみを返す。
例えば[0,1,2,4,5,7]
という入力であれば、["0->2","4->5","7"]
を返します。
前方から連続する数列を探していけば良いです。
i
を基準に連続する数列を探すようにしました。
見かけ上2重ループになっていますが、同じ要素を探索することはないので、計算量はO(N)
で、消費メモリはO(1)
です。
class Solution {
public:
vector<string> summaryRanges(vector<int>& nums) {
auto ans = vector<string>();
for (size_t i = 0; i < nums.size(); i++) {
int j = i;
while (j + 1 < nums.size() && nums[j] + 1 == nums[j + 1]) {
j++;
}
if (i == j) {
ans.push_back(to_string(nums[i]));
} else {
ans.push_back(to_string(nums[i]) + "->" + to_string(nums[j]));
}
i = j; // jまでは探索済みなので、iを更新します
}
return ans;
}
};