Skip to content

Latest commit

 

History

History
96 lines (85 loc) · 2.06 KB

data_stream_as_disjoint_intervals.md

File metadata and controls

96 lines (85 loc) · 2.06 KB

🔥 100% FAST 🔥 || Simple Fast and Easy || with Explanation

import 'dart:collection';

class SummaryRanges {
  HashMap<int, int> front = HashMap();
  HashMap<int, int> back = HashMap();
  HashSet<int> set = HashSet();
  SummaryRanges() {}

  void addNum(int value) {
    if (set.contains(value)) {
      return;
    }

    if (back.containsKey(value - 1) && front.containsKey(value + 1)) {
      int st = back[value - 1] ?? 0;
      int end = front[value + 1] ?? 0;
      front.remove(value + 1);
      front.remove(st);
      back.remove(end);
      back.remove(value - 1);
      front[st] = end;
      back[end] = st;
    } else if (front.containsKey(value + 1)) {
      int end = front[value + 1] ?? 0;
      front.remove(value + 1);
      back.remove(end);
      front[value] = end;
      back[end] = value;
    } else if (back.containsKey(value - 1)) {
      int st = back[value - 1] ?? 0;
      front.remove(st);
      back.remove(value - 1);
      front[st] = value;
      back[value] = st;
    } else {
      front[value] = value;
      back[value] = value;
    }
    set.add(value);
  }

  List<List<int>> getIntervals() {
    int n = front.length;
    List<List<int>> ans =
        List.filled(n, 0).map((e) => List.filled(2, 0)).toList();
    int i = 0;
    for (MapEntry<int, int> e in front.entries) {
      int p = e.key;
      int q = e.value;
      ans[i][0] = p;
      ans[i][1] = q;
      i++;
    }
    return ans;
  }
}
import 'dart:collection';

class SummaryRanges {
  late HashSet<int> dataSet;
  SummaryRanges() {
    this.dataSet = HashSet();
  }

  void addNum(int value) {
    dataSet.add(value);
  }

  List<List<int>> getIntervals() {
    List<List<int>> intervals = <int>[].map((e) => <int>[]).toList();

    int startI = -1, endI = -1;
    for (int n in dataSet) {
      if (startI == -1) {
        startI = n;
        endI = n;
      } else if (n == endI + 1) {
        endI = n;
      } else {
        intervals.add([startI, endI]);
        endI = n;
        startI = n;
      }
    }
    intervals.add([startI, endI]);
    return intervals;
  }
}