leetcode题目
视频拼接
题目描述
你将会获得一系列视频片段,这些片段来自于一项持续时长为 time 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。
使用数组 clips 描述所有的视频片段,其中 clips[i] = [starti, endi] 表示:某个视频片段开始于 starti 并于 endi 结束。
甚至可以对这些片段自由地再剪辑:
例如,片段 [0, 7] 可以剪切成 [0, 1] + [1, 3] + [3, 7] 三部分。
我们需要将这些片段进行再剪辑,并将剪辑后的内容拼接成覆盖整个运动过程的片段([0, time])。返回所需片段的最小数目,如果无法完成该任务,则返回 -1 。
测试用例
输入:
clips = [[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]], time = 10
输出:
3
解释:
选中 [0,2], [8,10], [1,9] 这三个片段。
然后,按下面的方案重制比赛片段:
将 [1,9] 再剪辑为 [1,2] + [2,8] + [8,9] 。
现在手上的片段为 [0,2] + [2,8] + [8,10],而这些覆盖了整场比赛 [0, 10]。
最初思路(贪心思想,但是错误)
所有的视频片段按照右节点降序排序,当右节点相等时,左节点较小的在前。
public int videoStitching(int[][] clips, int time) {
Arrays.sort(clips, (a,b)-> a[1] != b[1] ? b[1] - a[1] : a[0] - b[0]);
int ans = 0, cur = time;
for(int i = 0; i < clips.length; i++){
if(cur <= clips[i][1] && cur > clips[i][0]){
ans++;
cur = clips[i][0];
}
}
return cur == 0 ? ans : -1;
}
第42个测试用例未过
输入:
[[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]], 9
应为3
,实际为4
最后看题解的正确思路(动态规划,看的题解)
- 状态表示:
d
p
[
i
]
dp[i]
dp[i]表示以
time
为i
时,最短拼接次数 - 状态转移方程式: d p [ i ] = m i n ( d p [ i ] , d p [ c l i p [ 0 ] ] + 1 ) dp[i] = min(dp[i], dp[clip[0]] + 1) dp[i]=min(dp[i],dp[clip[0]]+1)
- 边界条件: d p [ 0 ] = 0 dp[0] = 0 dp[0]=0,但因为状态转移需要比较较小值,所以除dp[0]之外,不能初始化为0.
public int videoStitching(int[][] clips, int time) {
int n = clips.length;
int[] dp = new int[time+1];
Arrays.fill(dp, Integer.MAX_VALUE-1);
dp[0] = 0;
for(int i = 1; i <= time; i++){
for(int[] clip : clips){
if(clip[0] < i && clip[1] >= i) {
dp[i] = Math.min(dp[i], dp[clip[0]]+1);
}
}
}
return dp[time] == Integer.MAX_VALUE-1 ? -1 : dp[time];
}
蓝桥题目
1.重复字符串
题目描述
如果一个字符串
S
S
S 恰好可以由某个字符串重复
K
K
K 次得到,我们就称
S
S
S 是
K
K
K 次重复字符串。例如 abcabcabc
可以看作是 abc
重复
3
3
3 次得到,所以 abcabcabc
是
3
3
3 次重复字符串。
同理 aaaaaa 既是 2 2 2 次重复字符串、又是 3 3 3 次重复字符串和 6 6 6 次重复字符串。
现在给定一个字符串 S S S,请你计算最少要修改其中几个字符,可以使 S S S 变为一个 K K K 次字符串?
输入描述
输入第一行包含一个整数 K K K。
第二行包含一个只含小写字母的字符串 S S S。
其中, 1 ≤ K ≤ 1 0 5 , 1 ≤ ∣ S ∣ ≤ 1 0 5 , 1 ≤ K ≤ 1 0 5 , 1 ≤ ∣ S ∣ ≤ 1 0 5 1 ≤ K ≤ 10^5, 1 ≤ |S| ≤ 10^5, 1≤K≤10^5,1≤∣S∣≤10^5 1≤K≤105,1≤∣S∣≤105,1≤K≤105,1≤∣S∣≤105。其中 ∣ S ∣ |S| ∣S∣ 表示 S S S 的 长度.
测试用例
输入:
2
aabbaa
输出:
2
思路
题中提到字符串
S
S
S恰好由某个子字符串重复
K
K
K次构成,第一想法是把
主
串
S
主串S
主串S分成
K
K
K段进行遍历,并且记录字符出现的最大次数(curMax),那每次最少修改的次数为K-curMax
。主为贪心思想
算法实现
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int k = scan.nextInt();
String s = scan.next();
int n = s.length();
int m = n / k;
int ans = 0;
for(int i = 0; i < m; i++){
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int curMax = 0;
for(int j = 0; j < k; j++){
int cur = map.getOrDefault(s.charAt(i+j*m), 0) + 1;
curMax = Math.max(curMax, cur);
map.put(s.charAt(i+j*m), cur);
}
ans += k - curMax;
}
System.out.println(ans);
scan.close();
}
最终提交也论定我的思路是正确的,开心:)