写点什么

2025-01-22:使二进制数组全部等于 1 的最少操作次数Ⅱ。用 go 语言,给定一个二进制数组 nums,你可以对数组进行以下操作任意次(包括 0 次): 选择任何一个下标 i,并将从该下标开始到数组末

  • 2025-01-22
    北京
  • 本文字数:1424 字

    阅读完需:约 5 分钟

2025-01-22:使二进制数组全部等于 1 的最少操作次数Ⅱ。用 go 语言,给定一个二进制数组 nums,你可以对数组进行以下操作任意次(包括 0 次):


选择任何一个下标 i,并将从该下标开始到数组末尾的所有元素进行反转。反转的意思是将 0 变为 1,或将 1 变为 0。


请计算将 nums 数组中的所有元素都变为 1 所需的最少操作次数。


1 <= nums.length <= 100000。


0 <= nums[i] <= 1。


输入:nums = [0,1,1,0,1]。


输出:4。


解释:


我们可以执行以下操作:


选择下标 i = 1 执行操作,得到 nums = [0,0,0,1,0] 。


选择下标 i = 0 执行操作,得到 nums = [1,1,1,0,1] 。


选择下标 i = 4 执行操作,得到 nums = [1,1,1,0,0] 。


选择下标 i = 3 执行操作,得到 nums = [1,1,1,1,1] 。


答案 2025-01-22:


chatgpt


题目来自 leetcode3192。

大体步骤如下:

1.初始数组是 [0, 1, 1, 0, 1],初始操作次数 ops = 0。2.在遍历过程中,根据当前元素和操作次数的奇偶性来决定是否增加操作次数。3.遍历到第一个元素 0,此时操作次数为偶数,所以需要进行反转,此时数组变为 [1, 1, 1, 0, 1],操作次数加 1。4.继续遍历,下一个元素为 1,此时操作次数为奇数,不需要进行反转,操作次数不变。5.遍历到下一个元素 1,仍然不需要反转,操作次数不变。6.下一个元素为 0,操作次数为奇数,需要进行反转,此时数组变为 [1, 1, 1, 1, 0],操作次数加 1。7.最后一个元素是 1,操作次数为偶数,需要进行反转,此时数组变为 [1, 1, 1, 1, 1],操作次数加 1。


最终的操作次数为 4,将数组中所有元素变为 1 需要进行 4 次操作。


总的时间复杂度:遍历数组需要 O(n) 的时间复杂度,其中 n 是数组的长度。


总的额外空间复杂度:在解决问题的过程中,只使用了常数级别的额外空间,额外空间复杂度为 O(1)。

Go 完整代码如下:

package main
import ( "fmt")
func minOperations(nums []int) int { ops := 0 for _, num := range nums { if (num == 0 && ops%2 == 0) || (num == 1 && ops%2 == 1) { ops++ } } return ops}
func main() { nums := []int{0, 1, 1, 0, 1} result := minOperations(nums) fmt.Println(result)}
复制代码


Rust 完整代码如下:

fn min_operations(nums: Vec<i32>) -> i32 {    let mut ops = 0;    for &num in &nums {        if (num == 0 && ops % 2 == 0) || (num == 1 && ops % 2 == 1) {            ops += 1;        }    }    ops}
fn main() { let nums = vec![0, 1, 1, 0, 1]; let result = min_operations(nums); println!("{}", result);}
复制代码


python 完整代码如下:

# -*-coding:utf-8-*-
def min_operations(nums): ops = 0 for num in nums: if (num == 0 and ops % 2 == 0) or (num == 1 and ops % 2 == 1): ops += 1 return ops
if __name__ == "__main__": nums = [0, 1, 1, 0, 1] result = min_operations(nums) print(result)
复制代码


solidity 完整代码如下:

// SPDX-License-Identifier: MITpragma solidity ^0.8.0;
contract MinOperations { function minOperations(uint256[] memory nums) public pure returns (uint256) { uint256 ops = 0; for (uint256 i = 0; i < nums.length; i++) { if ((nums[i] == 0 && ops % 2 == 0) || (nums[i] == 1 && ops % 2 == 1)) { ops++; } } return ops; }}
复制代码



发布于: 刚刚阅读数: 4
用户头像

公众号:福大大架构师每日一题 2021-02-15 加入

公众号:福大大架构师每日一题

评论

发布
暂无评论
2025-01-22:使二进制数组全部等于 1 的最少操作次数Ⅱ。用go语言,给定一个二进制数组 nums,你可以对数组进行以下操作任意次(包括0次): 选择任何一个下标 i,并将从该下标开始到数组末_福大大架构师每日一题_福大大架构师每日一题_InfoQ写作社区