MeetingRoomsOPT2 [source code]


public class MeetingRoomsOPT2 {
    public boolean canAttendMeetings(Interval[] intervals) {
        if (intervals.length <= 1) return true;
        sortOnStart(intervals, 0, intervals.length - 1);

        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i].start < intervals[i-1].end) return false;
        }
        return true;
    }

    private void sortOnStart(Interval[] inter, int lo, int hi) {
        if (lo >= hi) return;

        int i = lo;
        int j = hi;
        int pivot = inter[lo + (hi - lo) / 2].start;
        while (i <= j) {
            while (inter[i].start < pivot) i++;
            while (inter[j].start > pivot) j--;
            if (i <= j) {
                Interval temp = inter[i];
                inter[i] = inter[j];
                inter[j] = temp;
                i++;
                j--;
            }
        }   

        if (lo < j) sortOnStart(inter, lo, j);
        if (i < hi) sortOnStart(inter, i, hi);
    }

    public static void main(String[] args) {
        MeetingRoomsOPT2 tester = new MeetingRoomsOPT2();
        Interval[] input1 = {
            new Interval(0, 30),
            new Interval(5, 10),
            new Interval(15, 20),
        };
        Interval[] input2 = {
            new Interval(5, 8),
            new Interval(6, 8),
        };
        Interval[] input3 = {
            new Interval(1,2),
            new Interval(3,4),
            new Interval(6,8),
        };
        Interval[] input4 = {
            new Interval(0,3),
            new Interval(1,4),
            new Interval(3,6),
            new Interval(5,8),
            new Interval(2,5),
            new Interval(4,7),
            new Interval(6,9),
        };
        System.out.println(tester.canAttendMeetings(input3));
    }
}

这个是 submission 最优解, 3ms, 99%;
问了一下 guoye, 这个是quicksort, 不过是一个inplace splitting的版本;

这个算法刚开始没看懂其实是因为这里的 split 的过程其实是一个 inplace 的 split. 而且这个 inplace 的 split 跟 CLRS 上的做法不太一样. CLRS 上面的做法实际上还稍微复杂一些, L 和 G 之间的分界线是一直在变化的. 这里这个方法更加简单直接: 就用 mid 作为分界线, 然后你写 loop 的时候记住, mid 的左边的invariant 是始终只保留 L, 也就是比 pivot 小的 element, mid 右边的只保留G里面的内容. 而保证这个 invariant 的具体操作就是 swap.

幸亏在 submission 里面找了一下最优解, 不然还真的没有学到这么好的一个算法; g4g 上面的 partition 其实用的也是 CLRS 书上那个做法.

/**

  • 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; }
  • }
    */

Problem Description

Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si < ei), determine if a person could attend all meetings.

For example,
Given [[0, 30],[5, 10],[15, 20]],
return false.

Difficulty:Easy
Category:Algorithms
Acceptance:46.78%
Contributor: LeetCode
Companines
Facebook
Related Topics
sort
Similar question
Merge Intervals Meeting Rooms II

results matching ""

    No results matching ""