算法题记录 20
1278.分割回文串3(1979)
给你一个由小写字母组成的字符串 s,和一个整数 k。
请你按下面的要求分割字符串:
首先,你可以将 s 中的部分字符修改为其他的小写英文字母。
接着,你需要把 s 分割成 k 个非空且不相交的子串,并且每个子串都是回文串。
请返回以这种方式分割字符串所需修改的最少字符数。
涉及知识点
字符串,dfs
解决思路
是“算法题记录19”中第一题的进阶,看似变得很复杂,要判断修改多少次。其实我们继续dfs的枚举思路,不用去管怎么最少修改,只需把所有可能枚举出来,并统计每种方法的修改次数,取最小即可。
1 | class Solution: |
3066.超过阈值的最少操作数2(1400)
给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。
你可以对 nums 执行一些操作,在一次操作中,你可以:
选择 nums 中 最小 的两个整数 x 和 y 。
将 x 和 y 从 nums 中删除。
将 min(x, y) * 2 + max(x, y) 添加到数组中的任意位置。
注意,只有当 nums 至少 包含两个元素时,你才可以执行以上操作。
你需要使数组中的所有元素都 大于或等于 k ,请你返回需要的 最少 操作次数。
涉及知识点
最小堆
解决思路
秒答题,找个办法维护有序,取最小两个计算判断即可,用列表的话时间比较慢,最小堆是解决这种问题比较快的。
1 | class Solution: |
3266.K次乘运算后的最终数组2(2509)
给你一个整数数组 nums ,一个整数 k 和一个整数 multiplier 。
你需要对 nums 执行 k 次操作,每次操作中:
找到 nums 中的 最小 值 x ,如果存在多个最小值,选择最 前面 的一个。
将 x 替换为 x * multiplier 。
k 次操作以后,你需要将 nums 中每一个数值对 109 + 7 取余。
请你返回执行完 k 次乘运算以及取余运算之后,最终的 nums 数组。
涉及知识点
最小堆,数学
解决思路
乍一看是秒答题,但实际上会发现在数值较大时会超时,我们需要对计算过程进行简化,然后会发现在数值较大、数量较多时仍会超时,而对于两个数 x 和 y,如果 x 在 y 左边,且 x≤y 以及 x⋅multiplier>y,那么我们会先操作 x,然后操作 y。由于 x⋅multiplier≤y⋅multiplier,这意味着下一次一定会操作 x。继续推导下去,后面的操作顺序一定是 y,x,y,x,⋯
所以我们可以先手动让原数组的最大值mx成为最小值,然后就可以依次循环乘不需要维护最小堆了。
1 | class Solution: |
3239.最少翻转次数使二进制矩阵回文1(1388)
给你一个 m x n 的二进制矩阵 grid 。
如果矩阵中一行或者一列从前往后与从后往前读是一样的,那么我们称这一行或者这一列是 回文 的。
你可以将 grid 中任意格子的值 翻转 ,也就是将格子里的值从 0 变成 1 ,或者从 1 变成 0 。
请你返回 最少 翻转次数,使得矩阵 要么 所有行是 回文的 ,要么所有列是 回文的 。
涉及知识点
字符串、表格
解决思路
要么行是回文的,要么列是回文的,可知这两种情况是等效的。我们只需对每行进行回文判断,遇见前后不同的值计数加一,然后对每列做同样的事,返回两个计数的最小值即可。
1 | class Solution: |
声明
题目均来源于leetcode公开题库,部分方法解析来源于高赞题解,如有不妥请联系。