LeetCode_前缀和_滑动窗口_中等_1004.最大连续1的个数 III

news/2024/5/20 9:45:23 标签: leetcode, 前缀和, 二分搜索, 滑动窗口

目录

  • 1.题目
  • 2.思路
  • 3.代码实现(Java)

1.题目

给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回数组中连续 1 的最大个数。

示例 1:
输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输出:6
解释:[1,1,1,0,0,1,1,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 6。

示例 2:
输入:nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
输出:10
解释:[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 10。

提示:
1 <= nums.length <= 105
nums[i] 不是 0 就是 1
0 <= k <= nums.length

2.思路

(1)前缀和

(2)前缀和 & 二分搜索

(3)滑动窗口

3.代码实现(Java)

//思路1————前缀和
class Solution {
    public int longestOnes(int[] nums, int k) {
        int n = nums.length;
        /* 
            preSum[i] 表示 nums[0...i - 1] 的累加和
            preSum[j + 1] - preSum[i] 为 nums[i...j] 的累加和
        */
        int[] preSum = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            preSum[i] = preSum[i - 1] + nums[i - 1];
        }
        int res = 0;
        for (int i = 0; i < n; i++) {
            for (int j = n; j >= i + 1; j--) {
                // nums[i...j - 1]
                int len = j - i;
                if (len - (preSum[j] - preSum[i]) <= k) {
                    res = Math.max(res, len);
                    break;
                }
            }
            if (res >= n - i) {
                break;
            }
        }
        return res;
    }
}
//思路2————前缀和 & 二分搜索
class Solution {
    public int longestOnes(int[] nums, int k) {
        int n = nums.length;
        /*
            preSum[i] 表示 nums[0...i - 1] 中 0 的个数
            preSum[j + 1] - preSum[i] 为 nums[i...j] 中 0 的个数
        */
        int[] preSum = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            preSum[i] = preSum[i - 1] + (1 - nums[i - 1]);
        }
        int res = 0;
        for (int i = 0; i < n; i++) {
            int left = binarySearch(preSum, preSum[i + 1] - k);
            res = Math.max(res, i - left + 1);
        }
        return res;
    }

    //查找 target 在 nums 中的左边界
    public int binarySearch(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }

}
//思路3———滑动窗口
class Solution {
    public int longestOnes(int[] nums, int k) {
        int n = nums.length;
        int left = 0;
        int leftCnt = 0;
        int rightCnt = 0;
        int res = 0;
        for (int right = 0; right < n; ++right) {
        	// rightCnt 记录 nums[0...right] 中 0 的数量
            rightCnt += 1 - nums[right];
            while (rightCnt - leftCnt > k) {
	            // leftCnt 记录 nums[0...left] 中 0 的数量
                leftCnt += 1 - nums[left];
                left++;
            }
            res = Math.max(res, right - left + 1);
        }
        return res;
    }
}

http://www.niftyadmin.cn/n/472708.html

相关文章

其他品牌的触控笔能用在ipad上?好用不贵手写笔推荐

任何一种产品&#xff0c;都是有好有坏&#xff0c;就像苹果的Pencil&#xff0c;因为受到了消费者的欢迎&#xff0c;所以也推出了一些新的产品&#xff0c;比如平替电容笔&#xff0c;这些产品&#xff0c;有的质量好&#xff0c;有的价格低&#xff0c;被消费者所接受。但也…

Verilog/C++实现排序算法

Verilog/C实现排序算法 1、冒泡排序算法 冒泡排序是一种简单的交换类排序。 冒泡排序算法的原理如下&#xff1a; 1、比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。2、对每一对相邻元素做同样的工作&#xff0c;从开始第一对到结尾的最后一对。在这一…

图像的灰度处理

在OpenCV中&#xff0c;灰度处理主要有两种方法&#xff1a;亮度法和加权平均法。 亮度法&#xff08;Luminosity Method&#xff09;&#xff1a;灰度图像的亮度法是通过对彩色图像的RGB通道进行加权平均来计算灰度值。通常使用以下公式计算每个像素的灰度值&#xff1a; g r…

Android Camera2获取图像的最简编程

通过Android官方的Camera2Basic工程源码&#xff0c;总结出的Android摄像头获取图像的最简编程实现: 步骤1: 申请权限 因摄像头是一个隐私性非常强的设备&#xff0c;所以需要弹框向用户申请权限。 在工程配置文件AndroidManifest.xml中标明使用权限: <uses-permission and…

AI生成--简单的vue项目搭建步骤

安装Node.js&#xff1a;如果没有安装Node.js&#xff0c;需要先下载安装。 安装Vue CLI&#xff1a;在命令行中输入以下命令安装&#xff1a; npm install -g vue/cli创建项目&#xff1a;在命令行中输入以下命令创建一个新的项目&#xff1a; vue create my-project该命令会…

实现分布式事务的新标杆:RocketMQ的全面解析与应用指南

在分布式系统中&#xff0c;实现事务的一致性和可靠性是一项重要的挑战。本文将详细介绍如何利用 RocketMQ 的半消息机制来实现分布式事务&#xff0c;并提供具体的代码示例和最佳实践。 1. 引言 在分布式系统中&#xff0c;事务处理是一项复杂而关键的任务。传统的 ACID 事务…

【*1900 换根DP】CF1092F

感觉很简单&#xff0c;根本没有1900的难度 CF1092F Tree with Maximum Cost - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)y 题意&#xff1a; 思路&#xff1a; 考虑换根DP 首先先树形DP&#xff0c;然后dfs换根 设dp[u]为在以u为根的子树上&#xff0c;所有点的贡献 …

NCV2903DR2G 低偏移电压比较器

NCV2903DR2G安森美深力科是一款双独立精密电压比较器&#xff0c;能够进行单电源或分电源操作。这些设备被设计为允许在单电源操作的情况下实现共模范围到地电平。低至2.0 mV的输入偏移电压规格使该设备成为消费类汽车和工业电子中许多应用的绝佳选择。 特性&#xff1a; 1.宽…