Advertisement
PsiAmp

Untitled

Aug 19th, 2022 (edited)
864
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.92 KB | Source Code | 0 0
  1. package sandbox;
  2.  
  3. import java.util.Arrays;
  4.  
  5. public class FindRange {
  6.  
  7.     class Range{
  8.         int l;
  9.         int r;
  10.  
  11.         public Range(int l, int r) {
  12.             this.l = l;
  13.             this.r = r;
  14.         }
  15.     }
  16.  
  17.     private Range[] ranges;
  18.  
  19.     // Initialization time complexity: O(NlogN), since we sort ranges
  20.     public FindRange(String[] inputRanges) {
  21.         int n = inputRanges.length;
  22.         Range[] tmpRanges = new Range[n];
  23.  
  24.         for (int i = 0; i < n; i++) {
  25.             // TODO: Extract as method
  26.             String range = inputRanges[i];
  27.             String[] rng = range.split("-");
  28.             tmpRanges[i].l = Integer.valueOf(rng[0]);
  29.             tmpRanges[i].r = Integer.valueOf(rng[1]);
  30.         }
  31.  
  32.         // TODO Create a separate comparator
  33.         // Time complexity: O(NlogN)
  34.         Arrays.sort(tmpRanges, (a, b) -> a.l != b.l ? a.l - b.l : a.r - b.r);
  35.  
  36.         int count = 0;
  37.  
  38.         // Complexity: O(N)
  39.         for (int i = 1; i < n; i++) {
  40.             if (tmpRanges[count].r < tmpRanges[i].l) {
  41.                 // New range found
  42.                 count++;
  43.             } else {
  44.                 // Merge ranges
  45.                 tmpRanges[count].r = tmpRanges[i].r;
  46.             }
  47.         }
  48.  
  49.         Range[] mergedRanges = new Range[count + 1];
  50.         System.arraycopy(tmpRanges, 0, mergedRanges, 0, count + 1);
  51.  
  52.         this.ranges = mergedRanges;
  53.     }
  54.  
  55.     // Time complexity: O(logN)
  56.     // Find range using binary search in sorted ranges
  57.     public boolean isInRanges(int v) {
  58.         int l = 0;
  59.         int r = ranges.length - 1;
  60.        
  61.         while (l <= r) {
  62.             int mid = l + (r - l) / 2;
  63.            
  64.             if (ranges[mid].l >= v && v <= ranges[mid].r)
  65.                 return true;
  66.            
  67.             if (ranges[mid].l < v)
  68.                 r = mid - 1;
  69.             else
  70.                 l = mid + 1;
  71.         }
  72.        
  73.         return false;
  74.     }
  75. }
  76.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement