跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

将二进制数组分成三个相等值的三部分算法解析

给定由 0 和 1 组成的数组,需将其分为三个非空部分且各部分二进制值相等。若 1 的总数不是 3 的倍数则无法分割。统计 1 的数量确定每部分应含 1 的个数,定位每部分起始位置。根据最后一部分的长度限制前两部分末尾位置,逐位比较验证是否相等。若满足条件返回分割点索引,否则返回 -1。

刀狂发布于 2025/1/18更新于 2026/6/217 浏览
将二进制数组分成三个相等值的三部分算法解析

题目描述

给定一个由 0 和 1 组成的数组 arr,将数组分成 3 个非空部分,使得所有这些部分表示相同的二进制值。

如果可以做到,请返回任何 [i, j],其中 i+1 < j,这样一来:

arr[0], arr[1], …, arr[i] 为第一部分; arr[i + 1], arr[i + 2], …, arr[j - 1] 为第二部分; arr[j], arr[j + 1], …, arr[arr.length - 1] 为第三部分。这三个部分所表示的二进制值相等。

如果无法做到,就返回 [-1, -1]。

注意,在考虑每个部分所表示的二进制时,应当将其看作一个整体。例如,[1,1,0] 表示十进制中的 6,而不会是 3。此外,前导零也是被允许的,所以 [0,1,1] 和 [1,1] 表示相同的值。

解题思路

  1. 主要思路是将给定的数组分为三个部分,确定固定区间的值,若不符合要求则返回 [-1, -1]。
  2. 优化点一:统计数组中 1 的个数,如果不是 3 的倍数,不符合题目要求,直接返回 [-1, -1]。
  3. 优化点二:如果 1 的个数为 0 且数组长度至少为 3,可直接返回 [0, 2]。
  4. 找到三个部分中每一个 1 开始的位置,以此隔离区间。
  5. 确定好三个部分后,由于最后一个部分到数组末尾的位置是确定的,反向确定第一个和第二个部分。通过循环逐位比较,若有不相等则返回 [-1, -1],否则返回符合要求的位置。

代码实现

class Solution {
    public int[] threeEqualParts(int[] arr) {
        // 统计数组中 1 的个数
        int sum = Arrays.stream(arr).sum();
        
        // 如果 1 的个数不能被 3 整除
        if (sum % 3 != 0) {
            return new int[]{-1, -1};
        }
        
        // 如果 sum 的和为 0,直接返回
        if (sum == 0) {
            return new int[]{0, 2};
        }
        
        // 将数组划分为三个部分,每部分应包含的 1 的数量
        int partial = sum / 3;
        
        // 分别去确定三个区间的开始位置
        int first = 0, second = 0, third = 0, cur = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 1) {
                if (cur == 0) {
                    first = i;
                } else if (cur == partial) {
                    second = i;
                } else if (cur == 2 * partial) {
                    third = i;
                }
                cur++;
            }
        }
        
        // 根据第三个区间位置的长度去确定第一个和第二个部分
        int len = arr.length - third;
        if (first + len <= second && second + len <= third) {
            int i = 0;
            while (third + i < arr.length) {
                // 如果不符合要求 直接结束
                if (arr[first + i] != arr[second + i] || arr[first + i] != arr[third + i]) {
                    return new int[]{-1, -1};
                }
                // 每次循环直接++
                i++;
            }
            // 返回最后的结果
            return new int[]{first + len - 1, second + len};
        }
        return new int[]{-1, -1};
    }
}

目录

  1. 题目描述
  2. 解题思路
  3. 代码实现
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Pico 4XVR 1.10.13 安装与使用指南
  • 多模态大模型主流架构与技术要点总结
  • 基于 DamoFD-0.5G 的 AR 虚拟试妆系统实现
  • 大模型 RLHF 技术原理与实战解析
  • 汇川 RobotLab 软件常规操作指南
  • 代码大模型浪潮下,IT 技术人员的应对与转型策略
  • 如何下载、安装whisper、faster_whisper?
  • Whisper-WebUI 本地部署与语音转写实战指南
  • AI 驱动的在线考试系统全流程开发实践
  • C++ 从零实现高质量随机数生成器
  • Hunyuan-MT-7B-WEBUI 术语统一后处理实现方案
  • nlohmann/json:C++ 中最像 Python 的 JSON 库
  • OpenClaw 实战:20 个精选 Skills 让 AI 助手更智能
  • ESP32 开发环境搭建与智能家居接入实战
  • 我国网络安全人才市场供需趋势与特征分析
  • 基于 AI + Remotion + n8n 构建全自动视频生成流水线
  • Python 图片绘制与输出常用库原理详解
  • OpenClaw 接入飞书机器人与 Kimi2.5 配置指南
  • 相干伊辛机在医疗及医疗 AI 领域的应用前景分析
  • HDFS 编程实践:命令、API 与部署

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online