天池 在线编程 三等分(模拟)

文章目录

    • 1. 题目
    • 2. 解题

1. 题目

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

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

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

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

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

3 <= A.size <= 30000
A[i] = 0  or  A[i] = 1示例
样例 1:
输入:[1,0,1,0,1]
输出:[0,3]样例 2:
输出:[1,1,0,1,1]
输出:[-1,-1]

https://tianchi.aliyun.com/oj/245867719779445300/277517718521058001
https://leetcode-cn.com/problems/three-equal-parts/

2. 解题

  • 就是检查每个部分尾部的0的个数一样,确定开始结束位置,见注释
class Solution {
public:/*** @param A: an array* @return: divide the array into 3 non-empty parts*/vector<int> threeEqualParts(vector<int> &A) {// write your code hereint sum = accumulate(A.begin(), A.end(), 0);if(sum%3 != 0)//1的个数不能整除3return {-1,-1};int i, j, part = sum/3, one = 0, tail0 = 0, n = A.size();if(part == 0)//没有1return {0,2};for(i = n-1; i >= 0; --i){if(A[i] == 1)one++;else{if(one==0)tail0++;//第三部分的尾部0个数}if(one == part)break;}int mid0 = 0, start = i;//start 为第三部分的可能开始点for(i--; i>=0 && A[i] != 1; i--){mid0++;//第二第三部分中间的0的个数}if(mid0 < tail0)//第二部分尾0的个数不能跟第三部分尾0一样多return {-1,-1};start -= mid0-tail0;//分一部分前置0给第三部分int count = 0;for(i = start-1, j = n-1; i >= 0; --i,--j){   // 比较 第二第三部分是否一样if(A[i]==1) count++;if(A[i] != A[j])return {-1,-1};if(count == part)//1的个数够了,跳出break;}mid0 = 0;int start1 = i;//第二分部可能的开始位置for(i--; i>=0 && A[i] != 1; i--){mid0++;//第一第二部分中间的0的个数}if(mid0 < tail0)//同上return {-1,-1};count = 0;start1 -= mid0-tail0;//第二部分开始的位置for(i = start1-1, j = n-1; i >= 0; --i,--j){if(A[i] == 1) count++;if(A[i] != A[j])return {-1,-1};if(count == part)break;}return {start1-1, start};//第一部分结束,第三部分开始}
};

50ms C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python设计模式之模板方法模式实例详解

1、模板方法模式定义 定义一个操作中的算法的框架&#xff0c;而将一些步骤延迟到子类中&#xff0c;使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤。 子类实现的具体方法叫作基本方法&#xff0c;实现对基本方法高度的框架方法&#xff0c;叫作模板方…

小米2s自带rec刷root_刷Magisk模块开机卡Logo了怎么办?两种方法教你轻松解决

虽然&#xff0c;Magisk由于工作原理的不同&#xff0c;其模块对系统的兼容性相比较于此前的Xposed框架模块要好得多&#xff0c;但是依旧有可能出现刷了模块之后&#xff0c;卡Logo&#xff0c;无法开机的情况。今天&#xff0c;小编就提供两种方式解决刷Magisk模块卡开机Logo…

设计模式——简单工厂

设计模式——简单工厂 工厂角色&#xff1a; package designpattern.creation.simplefactory;/** * 此处的工厂简单写成一个类&#xff0c;因为&#xff08;简单工厂的工厂&#xff09;不会有继承或拓展&#xff0c;可以不用写成接口。*/ public class Factory {public IProduc…

proteus如何添加stm32_电路仿真软件详谈(六),Proteus电路仿真软件的超级应用

一款优秀的电路仿真软件&#xff0c;可帮助用户更好实现相应功能&#xff0c;而Proteus电路仿真软件便是这样一款利器。本文中&#xff0c;将讲解基于Proteus电路仿真软件的SPI接口的设计与实现。通过本文&#xff0c;希望大家对Proteus电路仿真软件的应用具备深层次的理解。1、…

LeetCode 803. 打砖块(并查集)

文章目录1. 题目2. 解题1. 题目 有一个 m x n 的二元网格&#xff0c;其中 1 表示砖块&#xff0c;0 表示空白。 砖块 稳定&#xff08;不会掉落&#xff09;的前提是&#xff1a; 一块砖直接连接到网格的顶部&#xff0c;或者至少有一块相邻&#xff08;4 个方向之一&#x…

python设计模式之享元模式

一、享元模式定义&#xff1a; 享元模式是一种用于解决资源和性能压力时会使用到的设计模式&#xff0c;它的核心思想是通过引入数据共享来提升性能。 在开发3D游戏时&#xff0c;例如有成千上万的士兵或者有成千上万棵树&#xff0c;如果一个3D地带的每个对象都单独创建&…

allegro多版本安装_Homebrew 安装旧版本软件包马克

大家好我叫乌图米&#xff0c;我会在这里陆续跟大家分享一些有的没的数码体验、软件技巧、系统知识&#xff0c;欢迎大家留言与我交流&#xff5e;如果你喜欢文章的内容&#xff0c;可以在文末点个赞 &#xff0c;你的支持就是我最大的动力 &#xff01;这篇文章介绍一下 Homeb…

利用Python实现PDF转文本,就是如此简单!

一、前言 对很多人来说&#xff0c;将PDF转换为可编辑的文本是个刚需&#xff0c;却苦于没有简单的方法。发现 pdf 幻灯片&#xff0c;效果还不错。 传统的讲座通常伴随有很多pdf幻灯片。一般来说&#xff0c;想要对自己的讲座做笔记&#xff0c;需要从pdf复制、补充大量内容…

LeetCode 1725. 可以形成最大正方形的矩形数目

文章目录1. 题目2. 解题1. 题目 给你一个数组 rectangles &#xff0c;其中 rectangles[i] [li, wi] 表示第 i 个矩形的长度为 li 、宽度为 wi 。 如果存在 k 同时满足 k < li 和 k < wi &#xff0c;就可以将第 i 个矩形切成边长为 k 的正方形。 例如&#xff0c;矩形…

Qt pro文件语法

在Qt下做开发的时候.pro文件就是工程的配置文件&#xff0c;虽然很多时候里面的选项是工具自动生成的&#xff0c;但是难免会需要手动修改的时候&#xff0c;下面就记录一下它的基本语法 #&#xff1a;在.pro文件中表示注释&#xff0c;注释当前行 TEMPLATE&#xff1a;模板 IN…

Python实现给指定的微信朋友发信息

一、环境准备 1、Python3.6 2、itchat第三方库 pip install itchat-uos 3、pyinstaller第三方库 pip install pyinstaller 二、核心代码 import itchatimport timeprint("请扫描弹出的扫二维码")itchat.auto_login(hotReloadTrue)boom_name input("请输…

LeetCode 1726. 同积元组(排列组合)

文章目录1. 题目2. 解题1. 题目 给你一个由 不同 正整数组成的数组 nums &#xff0c;请你返回满足 a * b c * d 的元组 (a, b, c, d) 的数量。其中 a、b、c 和 d 都是 nums 中的元素&#xff0c;且 a ! b ! c ! d 。 示例 1&#xff1a; 输入&#xff1a;nums [2,3,4,6] 输…

vuedraggle choose_如何拆分员工工资条,教你一招一学就会。(五)函数CHOOSE

作为人事管理者&#xff0c;我们最重要的一个工作就是工资表&#xff0c;那么如何将工资表拆分成工资条呢&#xff1f;我们最后看一下函数CHOOSE对函数MOD、ROW、OFFSET 、INT的嵌套使用。第一步&#xff0c;我们输入函数CHOOSE&#xff0c;第一个值是序号&#xff0c;我们将之…

about window.onload

在前几天一次练习中因为我要在页面加载完成后调用一个函数&#xff0c;于是我在javascript中用了window. onload&#xff0c;这个方法以前从学习js就在使用&#xff0c;有时还用来调用多个函数。然而我在这次想偷懒&#xff0c;就这样写了一段代码&#xff1a; window.οnlοad…

用pythone画棵圣诞树,祝大家圣诞快乐

一、python环境&#xff1a; 根据电脑的情况去下载对应的python安装包&#xff0c;我使用的是python3.7.0的版本 二、python编译器&#xff1a; 打开pycharm&#xff0c;然后我们创建一个project&#xff0c;在project下创建一个python file&#xff0c;建议取名字不要使用中…

LeetCode 1727. 重新排列后的最大子矩阵(前缀和+排序)

文章目录1. 题目2. 解题1. 题目 给你一个二进制矩阵 matrix &#xff0c;它的大小为 m x n &#xff0c;你可以将 matrix 中的 列 按任意顺序重新排列。 请你返回最优方案下将 matrix 重新排列后&#xff0c;全是 1 的子矩阵面积。 示例 1&#xff1a; 输入&#xff1a;ma…

亚马逊出的平板电脑_亚马逊Fire HD 8 Plus评测:适合看视频和轻度游戏的廉价平板...

导语&#xff1a;近日&#xff0c;亚马逊升级了旗下的Fire HD 8和Fire HD 8 Plus平板电脑&#xff0c;使其具有更多的内存&#xff0c;更快的处理器和USB-C充电功能。亚马逊Fire HD 8 Plus是Fire HD 8 的一个增强版本&#xff0c;它提供了较HD8更快的速度&#xff0c;拥有一些通…

利用python转换图片格式

前言 常见的图像任务通常需要把照片统一成相同的格式&#xff0c;所以此文章正是为了统一格式而生&#xff0c;常见的主要有cv2和PIL.Image的相关操作&#xff0c;照片格式是一串数字加上后缀名 工具一&#xff1a;cv2 pip install opencv-python 之后就可以 import cv2 1.…

C# 6.0语法新特性体验(二)

之前我在文章通过Roslyn体验C# 6.0的新语法中介绍了一些C# 6.0的语法特性&#xff0c;现在随着Visual Studio 14 CTP3的发布&#xff0c;又陆续可以体验一些新的特性了&#xff0c;这里简单的介绍一下之前没有介绍的新语法。 属性表达式&#xff08;Property Expressions&#…

TensorFlow 2.0 - 张量/自动求导/梯度下降

文章目录1. 张量2. 自动求导、梯度下降学习于&#xff1a;简单粗暴 TensorFlow 2 1. 张量 import tensorflow as tf print(tf.__version__) # 2.3.1random_float tf.random.uniform(shape()) # tf.Tensor(0.80420315, shape(), dtypefloat32) zero_vec tf.zeros(shape(2)) …