java解法:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 创建Scanner对象用于输入
        Scanner sc = new Scanner(System.in);

        // 输入数组的大小
        int size = sc.nextInt();
        // 输入最多允许的零的个数
        int toRemove = sc.nextInt();

        // 创建并初始化数组,所有元素初始为1
        int[] arr = new int[size];
        Arrays.fill(arr, 1);

        // 输入并设置数组中要置为零的索引位置
        for (int i = 0; i < toRemove; i++) {
            int index = sc.nextInt() - 1;  // 输入的索引是从1开始,减去1转为0基索引
            arr[index] = 0;  // 将该索引位置的元素置为零
        }

        // 输入最多允许的零的个数
        int maxZeros = sc.nextInt();
        
        // 调用findMaxSubarray函数计算结果并输出
        System.out.println(findMaxSubarray(arr, maxZeros));
    }

    // findMaxSubarray方法用于找到符合条件的最长子数组
    public static int findMaxSubarray(int[] arr, int maxZeros) {
        // 左指针,初始化为0
        int left = 0;
        // 当前窗口中零的个数
        int zeroCount = 0;
        // 最大子数组的长度
        int maxLength = 0;

        // 右指针,遍历数组
        for (int right = 0; right < arr.length; right++) {
            // 如果当前元素为零,零的数量增加
            if (arr[right] == 0) {
                zeroCount++;
            }

            // 当零的个数超过maxZeros时,收缩窗口
            while (zeroCount > maxZeros) {
                // 如果左边的元素是零,减少零的数量
                if (arr[left] == 0) {
                    zeroCount--;
                }
                // 移动左指针,缩小窗口
                left++;
            }

            // 更新最大子数组的长度
            maxLength = Math.max(maxLength, right - left + 1);
        }

        // 返回最大的子数组长度
        return maxLength;
    }
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

c++解法:

#include 
#include 
#include 

#define MAX_TREES 10000  // 最大树木数量的定义

// 函数findMaxContinuous,用于找到最长的连续子数组,该子数组中最多有maxPlant个死树(即值为0的元素)
int findMaxContinuous(int trees[], int totalTrees, int maxPlant) {
    int start = 0;  // 左指针,表示子数组的起始位置
    int deadIndices[MAX_TREES];  // 存储死树(值为0)的位置
    int deadCount = 0;  // 当前窗口中死树的个数
    int maxLength = 0;  // 最长子数组的长度

    // 右指针,遍历整个树木数组
    for (int end = 0; end < totalTrees; end++) {
        if (trees[end] == 0) {  // 如果当前树是死的(值为0)
            deadIndices[deadCount++] = end;  // 将当前死树的位置加入deadIndices数组

            // 如果当前窗口中的死树数量超过了maxPlant,更新窗口
            if (deadCount > maxPlant) {
                // 计算并更新当前最长子数组的长度
                maxLength = (end - start > maxLength) ? end - start : maxLength;

                // 将左指针移到第一个死树的后面,即start跳到deadIndices[0] + 1的位置
                start = deadIndices[0] + 1;

                // 将deadIndices数组中的死树位置往前移动,移除掉最早的死树
                for (int i = 1; i < deadCount; i++) {
                    deadIndices[i - 1] = deadIndices[i];
                }
                // 减少死树计数
                deadCount--;
            }
        }

        // 更新当前窗口的最大长度
        maxLength = (end - start + 1 > maxLength) ? end - start + 1 : maxLength;
    }

    // 返回最终找到的最长合法子数组的长度
    return maxLength;
}

int main() {
    int totalTrees, deadTrees, maxPlant;
    
    // 输入树木的总数和死树的数量
    scanf("%d %d", &totalTrees, &deadTrees);

    // 初始化一个数组treeLine,表示所有树初始为活树(值为1)
    int treeLine[MAX_TREES];
    for (int i = 0; i < totalTrees; i++) {
        treeLine[i] = 1;  // 所有树初始值为1,表示活树
    }

    // 输入死树的索引,并将对应位置的树标记为死树(值为0)
    for (int i = 0; i < deadTrees; i++) {
        int deadIndex;
        scanf("%d", &deadIndex);
        treeLine[deadIndex - 1] = 0;  // 将该位置的树设为死树
    }

    // 输入最大允许的死树数量
    scanf("%d", &maxPlant);

    // 调用findMaxContinuous函数并输出结果
    printf("%d\n", findMaxContinuous(treeLine, totalTrees, maxPlant));

    return 0;
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

js解法:

// 引入 readline 模块,用于从标准输入获取用户输入
const readline = require("readline");

// 创建一个 readline 接口,用于处理输入和输出
const rl = readline.createInterface({
    input: process.stdin,  // 标准输入
    output: process.stdout,  // 标准输出
});

// 用于存储输入的各行数据
const inputs = [];

// 监听输入的每一行数据
rl.on("line", (input) => {
    // 将每行输入保存到 inputs 数组中
    inputs.push(input);

    // 当输入的行数达到4行时,表示输入已完成
    if (inputs.length === 4) {
        // 解析输入数据
        const total = parseInt(inputs[0], 10);  // 树的总数
        const deadCount = parseInt(inputs[1], 10);  // 死树的数量
        const deadPositions = inputs[2].split(" ").map(Number);  // 死树的位置数组
        const maxReplant = parseInt(inputs[3], 10);  // 最大可重新种植的死树数

        // 调用 findMaxConsecutive 函数来计算结果
        const result = findMaxConsecutive(total, deadPositions, maxReplant);
        
        // 输出计算结果
        console.log(result);

        // 清空 inputs 数组,准备处理下一个输入(如果有的话)
        inputs.length = 0;
    }
});

// 函数 findMaxConsecutive 用于寻找最长的连续子数组,子数组中最多可以有 k 个死树
function findMaxConsecutive(n, deadTrees, k) {
    let leftPtr = 0;  // 左指针,表示窗口的起始位置
    let replantCnt = 0;  // 当前窗口内的死树数量
    let maxConsec = 0;  // 最大的合法子数组长度
    let deadPos = new Set(deadTrees);  // 使用 Set 存储死树的位置,便于快速查找

    // 遍历数组,使用 rightPtr 作为右指针,表示当前窗口的结束位置
    for (let rightPtr = 0; rightPtr < n; rightPtr++) {
        // 如果当前右指针指向的树是死树,增加死树计数
        if (deadPos.has(rightPtr + 1)) {
            replantCnt++;
        }

        // 如果当前窗口内的死树数量超过了允许的最大数量 k,移动左指针收缩窗口
        while (replantCnt > k) {
            // 如果左指针指向的是死树,减少死树计数
            if (deadPos.has(leftPtr + 1)) {
                replantCnt--;
            }
            // 移动左指针,缩小窗口
            leftPtr++;
        }

        // 更新最大子数组的长度
        maxConsec = Math.max(maxConsec, rightPtr - leftPtr + 1);
    }

    // 返回最大连续合法子数组的长度
    return maxConsec;
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

c解法:

#include 
#include 
#include 

#define MAX_TREES 10000  // 定义树木数组的最大长度

// 函数 findMaxContinuous 用于找出最多可以允许 maxPlant 个死树的最长连续子数组
int findMaxContinuous(int trees[], int totalTrees, int maxPlant) {
    int start = 0;  // 初始化左指针,表示窗口的起始位置
    int deadIndices[MAX_TREES];  // 用于存储当前窗口中死树的位置
    int deadCount = 0;  // 当前窗口内死树的数量
    int maxLength = 0;  // 存储最大子数组的长度

    // 遍历整个树木数组,右指针右移
    for (int end = 0; end < totalTrees; end++) {
        // 如果当前树是死树(值为0),将其索引记录在 deadIndices 数组中
        if (trees[end] == 0) {
            deadIndices[deadCount++] = end;  // 增加死树计数并记录该死树的位置

            // 如果当前窗口中的死树数量超过了 maxPlant,缩小窗口
            if (deadCount > maxPlant) {
                // 计算并更新当前最大合法子数组的长度
                maxLength = (end - start > maxLength) ? end - start : maxLength;

                // 将左指针移动到第一个死树的后面,即 start 移动到 deadIndices[0] + 1
                start = deadIndices[0] + 1;

                // 将 deadIndices 数组中已经处理过的死树位置移除,更新剩余死树的位置
                for (int i = 1; i < deadCount; i++) {
                    deadIndices[i - 1] = deadIndices[i];
                }
                // 死树数量减少
                deadCount--;
            }
        }

        // 每次右指针移动时,更新最大子数组的长度
        maxLength = (end - start + 1 > maxLength) ? end - start + 1 : maxLength;
    }

    // 返回最大子数组的长度
    return maxLength;
}

int main() {
    int totalTrees, deadTrees, maxPlant;

    // 读取输入的总树木数量和死树的数量
    scanf("%d %d", &totalTrees, &deadTrees);

    // 初始化树木数组,所有树初始为活树(1)
    int treeLine[MAX_TREES];
    for (int i = 0; i < totalTrees; i++) {
        treeLine[i] = 1;  // 默认值为 1,表示活树
    }

    // 读取死树的索引,并将相应位置的树标记为死树(0)
    for (int i = 0; i < deadTrees; i++) {
        int deadIndex;
        scanf("%d", &deadIndex);
        treeLine[deadIndex - 1] = 0;  // 注意输入的索引是从1开始,需要减1
    }

    // 读取最大允许的死树数量
    scanf("%d", &maxPlant);

    // 调用 findMaxContinuous 函数来计算最大合法子数组的长度,并输出结果
    printf("%d\n", findMaxContinuous(treeLine, totalTrees, maxPlant));

    return 0;
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

代码已自测,如您发现有未覆盖到的情况,欢迎私信或留言! 会在看到的第一时间优化,感谢_

在这里插入图片描述

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/144095541"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!