当前位置: 首页 > news >正文

Leetcode 927 -- 思维

题目描述

三等分

思路

题目要求我们将源数组划分为三个连续的序列,即 [ 0 , i ] , [ i + 1 , j − 1 ] , [ j , n − 1 ] [0,i],[i+1,j-1],[j,n-1] [0,i],[i+1,j1],[j,n1] ,使得这三个序列的二进制所表示的数相等。
首先,我们需要挖掘出一个性质:存在这样三个序列的必要条件是 1 1 1 的个数必须为 3 3 3 的整数倍
很显然如果不能满足这个条件,是没有办法将划分出满足条件的三个序列的。那么现在思路就清晰多了。
我们可以通过判断 1 1 1 的个数,找出每个序列的起点。注意,由于前导 0 0 0 的存在,我们要保证每个序列都从最高位的 1 1 1 开始,这样可以方便我们判断序列是否相同。
序列的长度就是最后一个序列的长度,因为最后一个序列从它的最高位到数组的最后一个数都是必须要选的。
题目要求我们返回第一个序列的结尾和第三个序列的开头。注意!由于我们忽略的前导 0 0 0,所以这样我们不能直接返回我们前面求得的第三个序列的开头。不过,我们可以返回第二个序列的结尾的下一个元素,这个元素正是第三个序列的开头。

代码

class Solution {
public:
    vector<int> threeEqualParts(vector<int>& arr) {
        int cnt = 0, n = arr.size();
        for(int i = 0; i < n; i ++ )
            if(arr[i])  cnt ++ ;
        if(cnt == 0)    return {0, 2};
        if(cnt % 3)     return {-1, -1};
        
        int part = cnt / 3;
        // [0,i], [i+1,j-1], [j,n-1]
        // 求出每个序列的忽略前导0的第一个元素(必然是1),cur表示1的个数
        int first = 0, second = 0, third = 0, cur = 0;
        for(int i = 0; i < n; i ++ )
        {
            if(arr[i] == 1)
            {
                cur ++ ;
                if(cur == 1)    first = i;
                else if(cur == part + 1)    second = i;
                else if(cur == 2 * part + 1)    third = i;
            }
            // [first, first+len-1], [second, second+len-1], [third, third+len-1]
            // len = (n-1)-first+1
        }
        int len = n - 1 - third + 1;
        
        cout << first << ' ' << second << ' ' << third << endl;
        cout << len << endl;
        
        for(int i = 0; i < len; i ++ )
        {
            if(first + i >= second || second + i >= third)  return {-1, -1};
            if(arr[first + i] != arr[second + i] || arr[second + i] != arr[third + i])   return {-1, -1};
        }
        return {first + len - 1, (second + len - 1) + 1};
    }
};
http://www.dtcms.com/a/109231.html

相关文章:

  • Win10定时任务计划无法显示要执行的EXE任务程序界面,问题解决办法
  • 什么是检索增强生成(RAG)
  • 7-3 逆序的三位数
  • PyTorch 深度学习实战(33):联邦学习与隐私保护
  • CROSS JOIN第一个表中的每一行与第二个表中的每一行组合
  • 商城系统:电商时代的核心驱动力
  • Cribl 修改字段rename
  • Express学习笔记(四)——同源和跨域详解
  • (九)图形管线
  • Vue3.5 企业级管理系统实战(十三):TagsView标签栏导航
  • PyQt6实例_A股日数据维护工具_权息数据增量更新线程
  • 禹神:三小时快速上手TypeScript,TS速通教程(上篇、中篇、下篇,装饰器),根据视频整理
  • Windows查重工具,强烈推荐大家收藏!
  • 前端接收客户端返回的token值使用pinia持久化保存token
  • 元素定位-xpath
  • verl单机多卡与多机多卡使用经验总结
  • MCP的基本组成部分有哪些?MCP Servers服务器起到什么作用?
  • Jetpack Compose 状态管理指南:从基础到高级实践
  • 机器学习算法分类全景解析:从理论到工业实践(2025新版)
  • Electron读取本地Json文件(Win、Mac)
  • JSVMP逆向实战:原理分析与破解思路详解
  • day21 学习笔记
  • 【SPP】蓝牙链路控制(LC)在SPP中互操作性深度解析
  • Cron表达式
  • 什么是混杂模式?为什么 macvlan 依赖它
  • B2B2C商城系统开发:从规划到上线的全流程指南
  • 函数柯里化(Currying)介绍(一种将接受多个参数的函数转换为一系列接受单一参数的函数的技术)
  • 数字孪生在智慧城市中的前端呈现与 UI 设计思路
  • CentOS 7 镜像源失效解决方案(2025年)
  • 【Mysql】之索引详解