【leetcode】一維動態規劃題目彙總【視頻拼接】

1024. 視頻拼接

你將會獲得一系列視頻片段,這些片段來自於一項持續時長爲 T 秒的體育賽事。這些片段可能有所重疊,也可能長度不一。視頻片段 clips[i] 都用區間進行表示:開始於 clips[i][0] 並於 clips[i][1] 結束。我們甚至可以對這些片段自由地再剪輯,例如片段 [0, 7] 可以剪切成 [0, 1] + [1, 3] + [3, 7] 三部分。

我們需要將這些片段進行再剪輯,並將剪輯後的內容拼接成覆蓋整個運動過程的片段([0, T])。返回所需片段的最小數目,如果無法完成該任務,則返回 -1 。

示例 1:

輸入:clips = [[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]], T = 10
輸出:3
解釋:
我們選中 [0,2], [8,10], [1,9] 這三個片段。
然後,按下面的方案重製比賽片段:
將 [1,9] 再剪輯爲 [1,2] + [2,8] + [8,9] 。
現在我們手上有 [0,2] + [2,8] + [8,10],而這些涵蓋了整場比賽 [0, 10]。

動態規劃的方法求解 O(N*L^2)

class Solution:
    def videoStitching(self, clips: List[List[int]], T: int) -> int:
        dp=[0]*(T+1)
        clips=sorted(clips,key=lambda x:x[0])
        for i in range(len(clips)):
            if clips[i][0]==0: 
                dp[min(T,clips[i][1])]=1
            else:   
                break
        for i in range(len(clips)):
            l,r=clips[i][0],min(clips[i][1],T)
            for j in range(l,r+1):
                if not dp[j]==0:
                    for k in range(j,r+1):
                        dp[k]= dp[j]+1 if dp[k]==0 else min(dp[j]+1,dp[k])
        print(dp)
        return dp[T] if not dp[T]==0 else -1

貪心算法求解 O(nlogn + n) = O(nlogn).

這道題和算法書上的活動選擇問題基本一致。

利用貪心算法:在開始時間不大於t的視頻中選擇一個結束時間最大的那一個視頻,其中t是上一個選擇視頻的結束時間。

算法:

  1. 對視頻進行升序排列
  2. 選擇一個從零開始的視頻,它的結束時間是所有從零開始的視頻中最大的,賦值給t
  3. 然後在其他視頻中選擇一個開始時間不超過t的視頻,這個被選擇的視頻的結束時間也應該是最大的,賦值給t
  4. 重複3,直到所有的視頻都被遍歷,或者t已經大於等於T
class Solution(object):
    def videoStitching(self, clips, T):
        """
        :type clips: List[List[int]]
        :type T: int
        :rtype: int
        """
        clips=sorted(clips,key=lambda x:x[0])
        ans = 0
        last = 0
        for i in range(len(clips)):
            if (last >= T):break
            maxL = last
            j=i
            while (j < len(clips) and clips[j][0] <= last):
                #貪心地在後面區間能夠overlap的區間中找最長的
                maxL = max(maxL, clips[j][1])
                j+=1
            if (j == i):return -1;  #//沒有能選的就不能覆蓋掉區間
            last = maxL
            i = j - 1
            ans+=1
        return -1 if last < T else ans

1277. 統計全爲 1 的正方形子矩陣

給你一個 m * n 的矩陣,矩陣中的元素不是 0 就是 1,請你統計並返回其中完全由 1 組成的 正方形 子矩陣的個數。

示例 1:

輸入:matrix =
[
[0,1,1,1],
[1,1,1,1],
[0,1,1,1]
]
輸出:15
解釋:
邊長爲 1 的正方形有 10 個。
邊長爲 2 的正方形有 4 個。
邊長爲 3 的正方形有 1 個。
正方形的總數 = 10 + 4 + 1 = 15.

class Solution(object):
    def countSquares(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: int
        """
        from compiler.ast import flatten
        a=[0]*max(len(matrix),len(matrix[0]))
        a[0]=sum(flatten(matrix))
        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                if matrix[i][j]==1:
                    flag=True
                    area=1
                    while i-area>=0 and j-area>=0 and flag:
                        if self.masum(matrix,i,j,area)==pow(area+1,2):
                            a[area]+=1
                            area=area+1
                        else:
                            flag=False
        return sum(a)
    def masum(self,m,i,j,a):
        t=0
        for ii in range(i-a,i+1):
            for jj in range(j-a,j+1):
                t=t+m[ii][jj]
        return t


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章