2022/11/30 leecode与蓝桥刷题情况

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]表示以timei时,最短拼接次数
  • 状态转移方程式: 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 1K105,1S105,1K105,1S105。其中 ∣ 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();
}

最终提交也论定我的思路是正确的,开心:)
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值