• 927. 三等分 模拟


     927. 三等分

    给定一个由 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:

    输入:arr = [1,0,1,0,1]
    输出:[0,3]
    

    示例 2:

    输入:arr = [1,1,0,1,1]
    输出:[-1,-1]

    示例 3:

    输入:arr = [1,1,0,0,1]
    输出:[0,2]
    

    提示:

    • 3 <= arr.length <= 3 * 10^4
    • arr[i] 是 0 或 1

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/three-equal-parts
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    做题结果

    成功,此题需要比较清晰的模拟思路

    方法:模拟

    1. 0因为存在前导0,所以不能确定,但是1一定要能够均分为3份,此处可先判断。特别的全0返回,[0,n-1]

    2. 尾部0的数目是由最后一个数的遇到最后一个1之后0的个数决定的,这些0不是前导0无法抹去

     3. 有了尾部0的个数,有了1的个数,就可以分出3份了,最后比合成的三份是否全等即可

    1. class Solution {
    2. public int[] threeEqualParts(int[] arr) {
    3. int cnt = 0;
    4. for(int v:arr){
    5. cnt += v;
    6. }
    7. int n = arr.length;
    8. if(cnt == 0) return new int[]{0,n-1};
    9. if(cnt%3!=0) return new int[]{-1,-1};
    10. StringBuilder sb1 = new StringBuilder();
    11. StringBuilder sb2 = new StringBuilder();
    12. StringBuilder sb3 = new StringBuilder();
    13. int zeroCnt = 0;
    14. for(int i = n-1; i>=0;i--){
    15. if(arr[i]==1){
    16. zeroCnt = n-i-1;
    17. break;
    18. }
    19. }
    20. int curr = 0;
    21. int endZero = 0;
    22. int[] ans = new int[]{-1,-1};
    23. for(int i = 0; i < n; i++){
    24. if(curr <cnt/3||endZero<zeroCnt){
    25. if(arr[i]==1){
    26. sb1.append("1");
    27. ++curr;
    28. endZero = 0;
    29. }
    30. else if(sb1.length()>0) {
    31. sb1.append("0");
    32. endZero++;
    33. }
    34. }else if(curr <cnt/3*2||endZero<zeroCnt*2){
    35. if(ans[0]==-1) ans[0] = i-1;
    36. if(arr[i]==1){
    37. sb2.append("1");
    38. ++curr;
    39. endZero = zeroCnt;
    40. }
    41. else if(sb2.length()>0){
    42. sb2.append("0");
    43. endZero++;
    44. }
    45. }else{
    46. if(ans[1]==-1) ans[1] = i;
    47. if(arr[i]==1){
    48. sb3.append("1");
    49. ++curr;
    50. }
    51. else if(sb3.length()>0) sb3.append("0");
    52. }
    53. }
    54. return sb1.toString().equals(sb2.toString()) && sb2.toString().equals(sb3.toString())?ans:new int[]{-1,-1};
    55. }
    56. }

  • 相关阅读:
    进程控制的一些具体操作
    【格密码基础】详解ZSVP问题
    我开发了一个下载器 带宽拉满
    TrOCR模型微调【基于transformer的光学字符识别】
    基于Matlab的超像素图像分割
    学习笔记-数据结构-树与二叉树(2024-04-23)
    双通道音频功率放大电路,外接元件少, 通道分离性好,3V 的低压下可正常使用——D2025
    【问题解决】容器部署MySQL的数据在docker commit导出的镜像中丢失
    MySQL基础(DDL、DML、DQL)
    第六章《类的高级特性》第2节:包的创建和使用
  • 原文地址:https://blog.csdn.net/yu_duan_hun/article/details/125609072