首页 > 其他分享 >Leetcode 927 -- 思维

Leetcode 927 -- 思维

时间:2022-10-09 09:22:45浏览次数:77  
标签:arr third -- len second 序列 first Leetcode 927

题目描述

三等分

思路

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

标签:arr,third,--,len,second,序列,first,Leetcode,927
From: https://www.cnblogs.com/ALaterStart/p/16770969.html

相关文章

  • java在图片上绘制框框
    /***画缺陷框的图片文件*@paramfile{@linkFile}*@parampolygon缺陷框*@return带缺陷的文件*@throwsIOExceptionIO异常*......
  • css颜色渐变属性
    linear-gradient(颜色渐变,)例:toleft设置渐变方向,也可以换成toright=>totop=>tobottombackground:linear-gradient(toleft,#6be585,#dd3e54);效果图: ......
  • 斐波拉契数列
    斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89...这个数列从第3项开始,每一项都等于前两项之和。这个数列从第3项开始,每一项都等于前两项之和。a1=1,a2=1,an=an-1+an-2......
  • 如何理解一个程序员的真实价值
    方法论「求职」和「跳槽」我们虽然经常都在说,但却很少认真想过这些行为背后的意义。在我决定自己写书之前,经常会有程序员遇到职业困扰来找我,我一般会给他们推荐一些职......
  • 初识设计模式 - 外观模式
    简介外观设计模式(FacadeDesignPattern)又被叫作门面模式,其描述是,通过为多个复杂的子系统提供统一的接口,使得子系统更容易被使用。在现实生活中,常常存在办事复杂的情况,如......
  • IIS URL重写实现代理输出
    由于某些需要,我们可能需要通过代理输出其它服务器内容,并用使用https。下面使用两条规则,先转向https然后再使用代理输出。IIS版本需要7.0及以上版本 在web.config配置如......
  • json文本数据
    本文主要针对三个问题:json格式数据,text数据与json数据之间的关系,json和python字典的区别1、什么是json数据?json是文本数据,可以在网络中传输的通用数据,它是具有特定格......
  • 5条EF core性能优化技巧,让你程序健步如飞
    1.使用EF.Functions.xxx进行查询(1).使用EF.Functions.Like进行模糊查询要比StartsWith、Contains和EndsWith方法生成的SQL语句性能更优。A.Contains语句,生成的s......
  • 网络字序与主机字序转换
    1.网络字节序与主机字节序在Linux网络编程中,经常碰到网络字节序与主机字节序的相互转换。说到网络字节序与主机字节序需要清晰了解以下几个概念。字节序,顾名思义,指字节在......
  • Corn 每两小时执行一次
     //每个偶数整点执行,如0点,2点,4点。。。@Scheduled(cron="000/2**?")privatevoidtest2(){System.out.println("test2执行"+(newDate(......