算法记录 | Day36 贪心算法

435.无重叠区间

思路:

intervals = [ [1,2], [3,6], [7,12], [4,8], [10,16]]
[1,2]
	[3     |6]
	  [4   |    8]
	  		 [7     |    12]
	  		       [|10         16]

按照x[0]排序

class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        count = 1
        intervals = sorted(intervals,key = lambda x:x[0])
        for i in range(1,len(intervals)):
            if intervals[i][0] >= intervals[i-1][1]:
                count += 1
            else:
                intervals[i][1] = min(intervals[i-1][1],intervals[i][1])
        return len(intervals)-count 

按x[1]排序

class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        count = 1
        intervals = sorted(intervals,key = lambda x:x[1])
        end = intervals[0][1]
        for i in range(1,len(intervals)):
            if end <= intervals[i][0]:
                count += 1
                end = intervals[i][1]
        return len(intervals)-count 

763.划分字母区间

思路:

1.从头开始遍历字符串,遍历同时维护当前片段的开始位置 start 和结束位置 end。

2.对于字符串中的每个字符s[i],得到当前字母的最后一次出现的下标位置 letter_map[s[i]],则当前片段的结束位置一定不会早于 letter_map[s[i]],所以更新 end 值为 end = max(end,letter_map[s[i]])。

3.当i == end时,当前片段访问结束,当前片段的下标范围为[start,end],长度为end-start+1,将其长度加入答案数组,并更新 start 值为i+1,继续遍历。

4.最终返回答案数组。

class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        letter_map = dict()
        for i in range(len(s)):
            letter_map[s[i]] = i
        res =  []
        start, end = 0, 0
        for i in range(len(s)):
            end = max(end,letter_map[s[i]])
            if i == end:
                res.append(end - start + 1)
                start = i + 1
        return res

56.合并区间

思路:

1.先按首位置进行排序

2.定义res,当res为空时,及第一个区间,直接加入

3.判断区间是否重叠:

  • 区间起点小于前一个区间终点 res[- 1] [ 1 ]< interval[0],不重叠加入res
  • 重叠时,判断当前区间终点与前一个区间终点,取最大值,赋值给前一个区间终点,res[- 1] [1] = max(res[- 1] [1] ,interval[1])
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort(key = lambda x: x[0])
        res = []
        for interval in intervals:
             # 如果列表为空,或者当前区间与上一区间不重合,直接添加
            if not res or res[-1][1]< interval[0]:
                res.append(interval)
            else:
                # 否则与上一区间进行合并
                res[-1][1] = max(res[-1][1],interval[1])
        return res

你可能感兴趣的:(leetcode,算法,贪心算法,leetcode)