daily log 10.04.20

2 minute read

CHALLENGE

Given a list of intervals, remove all intervals that are covered by another interval in the list.

Interval [a,b) is covered by interval [c,d) if and only if c <= a and b <= d.

After doing so, return the number of remaining intervals.

QUESTIONS TO MYSELF:

Would I be helped by a dictionary? I don’t think so

Passes Initial Test

class Solution(object):
    def removeCoveredIntervals(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: int
        """

        curr_intervals = intervals

        def check_remaining_intervals(lower, upper, i):
            for ii,curr_interval in enumerate(curr_intervals):
                curr_lower = curr_interval[0]
                curr_upper = curr_interval[1]

                if (curr_lower < lower) and (curr_upper > upper):
                    curr_intervals.pop(i)
                    print('ci 1', curr_intervals)

                # if (curr_lower > lower) and (curr_upper < upper):
                #     curr_intervals.pop(ii)
                #     print('ci 2', curr_intervals)

        for i,interval in enumerate(intervals):
            lower = interval[0]
            upper = interval[1]
            check_remaining_intervals(lower, upper, i)

        return len(curr_intervals)

class Solution(object):
    def removeCoveredIntervals(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: int
        """

        curr_intervals = intervals

        def check_remaining_intervals(lower, upper, i):
            for ii,curr_interval in enumerate(curr_intervals):
                curr_lower = curr_interval[0]
                curr_upper = curr_interval[1]

                # if (curr_lower <= lower) and (curr_upper >= upper):
                if (curr_lower >= lower) and (upper >= curr_upper):
                    curr_intervals.pop(i)
                    print('ci 1', curr_intervals)

                # if (lower <= curr_lower) and (upper >= curr_upper):
                #     curr_intervals.pop(ii)
                #     print('ci 2', curr_intervals)

        for i,interval in enumerate(intervals):
            lower = interval[0]
            upper = interval[1]
            check_remaining_intervals(lower, upper, i)

        return len(curr_intervals)

Before Refactor

class Solution(object):
    def removeCoveredIntervals(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: int
        """

        curr_intervals = intervals

        def check_remaining_intervals(lower, upper, i):
            for ii,curr_interval in enumerate(curr_intervals):
                curr_lower = curr_interval[0]
                curr_upper = curr_interval[1]

                # if (curr_lower < lower) and (curr_upper > upper):
                if i != ii:
                    if (curr_lower <= lower) and (upper <= curr_upper):
                        curr_intervals.pop(i)
                        print('ci 1', curr_intervals)

                    if (curr_lower >= lower) and (upper >= curr_upper):
                        curr_intervals.pop(ii)
                        print('ci 2', curr_intervals)

        for i,interval in enumerate(intervals):
            lower = interval[0]
            upper = interval[1]
            check_remaining_intervals(lower, upper, i)

        return len(curr_intervals)

Before second refactor

class Solution(object):
    def removeCoveredIntervals(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: int
        """

        curr_intervals = intervals

        def check_remaining_intervals(lower, upper, i):
            for ii,curr_interval in enumerate(curr_intervals):
                curr_lower = curr_interval[0]
                curr_upper = curr_interval[1]


                if i != ii:
                    if (lower >= curr_lower) and (upper <= curr_upper):
                        curr_intervals.pop(i)

                    if (lower <= curr_lower) and (upper >= curr_upper):
                        curr_intervals.pop(ii)


        for i,interval in enumerate(intervals):
            lower = interval[0]
            upper = interval[1]
            check_remaining_intervals(lower, upper, i)

        return len(curr_intervals)

Final submission

class Solution(object):
    def removeCoveredIntervals(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: int
        """

        remaining = len(intervals)

        for i, (a,b) in enumerate(intervals):
            for j, (c,d) in enumerate(intervals):
                if (i!=j) and (c<=a) and (b<=d):
                    remaining -= 1
                    break
        return remaining