你將會獲得一系列視頻片段,這些片段來自于一項持續時長為 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],
示例 2:
輸入:clips = [[0,1],[1,2]], T = 5
輸出:-1
解釋:我們無法只用 [0,1] 和 [1,2] 覆寫 [0,5] 的整個程序,
示例 3:
輸入:clips = [[0,1],[6,8],[0,2],[5,6],[0,4],[0,3],[6,7],[1,3],[4,7],[1,4],[2,5],[2,6],[3,4],[4,5],[5,7],[6,9]], T = 9
輸出:3
解釋:我們選取片段 [0,4], [4,7] 和 [6,9] ,
示例 4:
輸入:clips = [[0,4],[2,8]], T = 5
輸出:2
解釋:注意,你可能錄制超過比賽結束時間的視頻,
題目分析
題目的要求就是要找出能夠覆寫T的所需最少片段(我沒有處理題目說的“再剪輯”,覺得沒有必要)
我們可以對二維陣列里面的一維陣列排個序,而且[i][0] 按照從小到大排列,若是相同的[i][0]則將[i][1]按照從大到小排列,
public int videoStitching(int[][] clips, int T) {
// 我先排一個序,clipse[i][0]按從小到大排列,相同[i][0]則將[i][1]從大到小排列
for (int i = 0; i < clips.length; i++) {
Arrays.sort(clips, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] == o2[0]) {
return o2[1] - o1[1];
}
return o1[0] - o2[0];
}
});
;
}
for (int i = 0; i < clips.length; i++) {
System.out.println(Arrays.toString(clips[i]));
}
排序完成之和,我們進行設定兩個指標,left和right,left指向clips[i][0],right指向clips[i][1],
遍歷整個陣列,在right<T的情況下,我們去找出
clips[j][0] >= left && clips[j][0] <= right && clips[j][1] > right
的陣列,并更新right,
但是這里還沒有考慮全面,要考慮如何計算多少個片段
這里我直接上代碼,根據代碼分析
public int videoStitching(int[][] clips, int T) {
// 我先排一個序,clipse[i][0]按從小到大排列,[i][1]從大到小排列
for (int i = 0; i < clips.length; i++) {
Arrays.sort(clips, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] == o2[0]) {
return o2[1] - o1[1];
}
return o1[0] - o2[0];
}
});
;
}
for (int i = 0; i < clips.length; i++) {
System.out.println(Arrays.toString(clips[i]));
}
//貪心演算法
//left指向clips[i][0],right指向clips[i][1],cnt計算多少片段
//這道題的思路:如果clips[i][1]>right且right<T,說明這個陣列在T范圍內,更新right
//找下一個clips[i][1]>right且right<T的陣列
int left = 0, right = 0, cnt = 0;
for (int i = 0; i < clips.length && right < T; i++) {
int tempRight = right, add = 0, j = i;
//right<clips[i][0]的情況,說明后面的區間的起點>right,就發生斷裂,視頻接不上了
if (right < clips[i][0]) {
break;
}
for (j = i; j < clips.length && clips[j][0] <= right; j++) {
if (clips[j][0] >= left && clips[j][0] <= right && clips[j][1] > right) {
// 0>=0&&0<=0&&2>0
tempRight = Math.max(clips[j][1], tempRight);
add = 1;
}
}
cnt += add;
right = tempRight;
i = j - 1;
}
if (right >= T) {
return cnt;
}
return -1;
}
做題反思
這道題考慮到很多細節的地方,很難考慮的那么全面,做題就是真的要慢慢來了,自己在不斷進步,題的難度也增加了,還需要多反思多回顧!
end.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/194728.html
標籤:其他
