1702. 修改后的最大二进制字符串
Difficulty: 中等
给你一个二进制字符串 binary ,它仅有 0 或者 1 组成。你可以使用下面的操作任意次对它进行修改:
- 操作 1 :如果二进制串包含子字符串 “00” ,你可以用 “10” 将其替换。
- 比方说, “00010” -> “10010”
- 操作 2 :如果二进制串包含子字符串 “10” ,你可以用 “01” 将其替换。
- 比方说, “00010” -> “00001”
请你返回执行上述操作任意次以后能得到的 最大二进制字符串 。如果二进制字符串 x 对应的十进制数字大于二进制字符串 y 对应的十进制数字,那么我们称二进制字符串x大于二进制字符串y。
示例 1:
输入:binary = "000110" |
示例 2:
输入:binary = "01" |
提示:
- 1 <= binary.length <= 105
-
binary仅包含 ‘0’ 和 ‘1’ 。
解法一
因为是补题,之前在群里有看见讨论,大致的提到了一些,所以这里很快就想到了贪心的思路。首先 01 是无法继续变化的,10 是可以变成 01 的,而开头连续的 1 肯定是不需要再变化的,变化只会使得结果变小,所以我们可以将除了开头连续的 1 以外的所有的 1 都转换到最后(一定是可以的,因为 10 可以变成 01),然后再将中间的 00 都转换成 10 最后剩下的就只有中间的一个 0,这样就使得结果最大了。最终的结果就是 1111…0…111 类似的形式
public class MaximumBinaryString { |
1703. 得到连续 K 个 1 的最少相邻交换次数
Difficulty: 困难
给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1 。每一次移动,你可以选择 相邻 两个数字并将它们交换。
请你返回使 nums 中包含 k 个连续 1 的最少交换次数。
示例 1:
输入:nums = [1,0,0,1,0,1], k = 2 |
示例 2:
输入:nums = [1,0,0,0,0,0,1,1], k = 3 |
示例 3:
输入:nums = [1,1,0,1], k = 2 |
提示:
- 1 <= nums.length <= 105
-
nums[i]要么是0,要么是1。 - 1 <= k <= sum(nums)
解法一
单独写了一篇文章整理类似的题,详见