- 博客主页:誓则盟约
- 系列专栏:IT竞赛 专栏
- 关注博主,后期持续更新系列文章
- 如果有错误感谢请大家批评指出,及时修改
- 感谢大家点赞👍收藏⭐评论✍
3191.使二进制数组全部等于1的最少操作次数I【中等】
题目:
给你一个二进制数组 nums
。
你可以对数组执行以下操作 任意 次(也可以 0 次):
- 选择数组中 任意连续 3 个元素,并将它们 全部反转 。
反转 一个元素指的是将它的值从 0 变 1 ,或者从 1 变 0 。
请你返回将 nums
中所有元素变为 1 的 最少 操作次数。如果无法全部变成 1 ,返回 -1 。
示例 1:
输入:nums = [0,1,1,1,0,0]
输出:3
解释:
我们可以执行以下操作:
- 选择下标为 0 ,1 和 2 的元素并反转,得到
nums = [1,0,0,1,0,0]
。 - 选择下标为 1 ,2 和 3 的元素并反转,得到
nums = [1,1,1,0,0,0]
。 - 选择下标为 3 ,4 和 5 的元素并反转,得到
nums = [1,1,1,1,1,1]
。
示例 2:
输入:nums = [0,1,1,1]
输出:-1
解释:
无法将所有元素都变为 1 。
提示:
3 <= nums.length <= 10**5
0 <= nums[i] <= 1
分析问题:
题目保证数组内的数要么0要么1,所以简单来说,通过一个循环从列表的前部分开始遍历。如果当前元素为 0
,则对其后面的两个元素进行异或操作(将值取反),并将操作次数加 1
。循环结束后,检查列表的最后两个元素是否都不为 0
。如果是,则返回操作次数;否则,返回 -1
。
代码实现:
class Solution:def minOperations(self, nums: List[int]) -> int:ans = 0for i in range(len(nums) - 2):if nums[i] == 0:nums[i + 1] ^= 1nums[i + 2] ^= 1ans += 1return ans if nums[-2] and nums[-1] else -1
3190.使所有元素都可以被3整数的最少操作数【简单】
题目描述:
给你一个整数数组 nums
。一次操作中,你可以将 nums
中的 任意 一个元素增加或者减少 1 。
请你返回将 nums
中所有元素都可以被 3 整除的 最少 操作次数。
示例 1:
输入:nums = [1,2,3,4]
输出:3
解释:
通过以下 3 个操作,数组中的所有元素都可以被 3 整除:
- 将 1 减少 1 。
- 将 2 增加 1 。
- 将 4 减少 1 。
示例 2:
输入:nums = [3,6,9]
输出:0
提示:
1 <= nums.length <= 50
1 <= nums[i] <= 50
分析问题:
数据量只有50,很小,一边遍历过去计数,计算不可以被3整除的元素的个数,这个个数就是最终答案,因为一次只能修改一个值,而一个值只需要被修改一次。
代码实现:
class Solution:def minimumOperations(self, nums: List[int]) -> int:v=0for i in nums:if i%3!=0: v+=1return v
总结:
详解:
- 定义变量
ans
用于记录操作次数,初始值为0
。 - 通过一个循环遍历列表
nums
,从索引0
到len(nums) - 2
。 - 在每次循环中,如果当前元素
nums[i]
为0
,则对其后面的两个元素nums[i + 1]
和nums[i + 2]
进行异或操作(将值取反),并将操作次数ans
加1
。 - 循环结束后,检查列表的最后两个元素
nums[-2]
和nums[-1]
是否都不为0
。 - 如果是,则返回操作次数
ans
;否则,返回-1
。
考点:
- 对列表的遍历和操作。
- 异或操作的理解和应用。
- 条件判断和逻辑处理。
收获:
- 加深了对列表操作的理解,包括如何遍历列表并根据条件进行修改。
- 掌握了异或操作的特性及其在解决问题中的应用。
- 提高了根据问题要求进行逻辑判断和处理的能力。
- 学会了如何根据特定的目标设计算法并通过代码实现。