Google - 1

作者: 宋翰要长肉 | 来源:发表于2016-03-22 11:50 被阅读9次

Question

Given an array of integers and a list of intervals with no over overlap between any two intervals, find a list integers from above array, which is in one of interval in above list of intervals

Algorithm

  • Sort intervals according their start time in increasing order
  • use binary search to check if the integer in one of intervals
    • set start point 0 and end point length of list minus 1
    • get mid point and check if the integer in midth interval
      • if the integer in midth interval, add the integer to output list of integer
      • if the integer is less than the start time of midth interval, set end mid - 1
      • if the integer is greater than the end time of midth interval, set start mid + 1
      • loops until start is greater than end

Complexity

  • time complexity: O(NlgN)
    • sort: O(NlgN)
    • find: O(lgN)
    • loops: O(N)
  • space complexity: O(N)
    • space of output list

Code

/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
public List<Integer> findNum(List<Interval> intervals, int[] nums) {
    List<Integer> result = new ArrayList<Integer>();
    if (nums == null || intervals == null) {        
        return result;
    }
    for (int num: nums) {
        if (checkInterval(intervals, num)) {
            result.add(num);
        }
    }
    return result;
}
private boolean checkInterval(List<Interval> intervals, int num) {
    int start = 0;
    int end = intervals.size() - 1;
    while (start <= end) {
        int mid = start + (end - start) / 2;
        int check = checkBelong(intervals.get(mid), num);
        if (check == 0) {
            return true;
        } else if (check == -1) {
            end = mid - 1;
        } else {
            start = mid + 1;
        }
    }
    return false;
}
private int checkBelong(Interval interval, int num) {
    if (num >= interval.start && num <= interval.end) {
        return 0;
    } else if (num < interval.start) {
        return -1;
    } else {        
        return 1;
    }
}

相关文章

网友评论

    本文标题:Google - 1

    本文链接:https://www.haomeiwen.com/subject/jixllttx.html