Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

สรุปช่วงข้อมูลแบบไม่ทับซ้อนใน C++ (Data Stream as Disjoint Intervals)

ภาพรวมปัญหา

รับสตรีมตัวเลขเข้ามาเรื่อยๆ สรุปเป็นรายการช่วง (intervals) ที่ไม่ทับซ้อนกัน ทุกครั้งที่เพิ่มตัวเลขใหม่

ตัวอย่าง

เพิ่ม: 1 → [[1,1]]
เพิ่ม: 3 → [[1,1],[3,3]]
เพิ่ม: 8 → [[1,1],[3,3],[8,8]]
เพิ่ม: 2 → [[1,3],[8,8]] (รวม 1,2,3)
เพิ่ม: 7 → [[1,3],[7,8]] (รวม 7,8)

วิธีแก้ปัญหา: Ordered Set

  • ใช้ set เก็บตัวเลขทั้งหมด (เรียงอัตโนมัติ)
  • ตอน getIntervals(): วนผ่าน set, รวมตัวเลขที่ติดกันเป็นช่วง

โค้ด C++

#include <bits/stdc++.h>
using namespace std;

class SummaryRanges {
public:
    set<int> nums;
    SummaryRanges() {}
    void addNum(int val) { nums.insert(val); }
    vector<vector<int>> getIntervals() {
        vector<vector<int>> ret;
        for (int x : nums) {
            if (ret.empty() || ret.back()[1] + 1 < x)
                ret.push_back({x, x});
            else
                ret.back()[1]++;
        }
        return ret;
    }
};

int main() {
    SummaryRanges ob;
    ob.addNum(1);  // [[1,1]]
    ob.addNum(3);  // [[1,1],[3,3]]
    ob.addNum(8);  // [[1,1],[3,3],[8,8]]
    ob.addNum(2);  // [[1,3],[8,8]]
    ob.addNum(7);  // [[1,3],[7,8]]
}

การวิเคราะห์ความซับซ้อน

  • addNum: O(log n)
  • getIntervals: O(n)
  • พื้นที่: O(n)