zoukankan      html  css  js  c++  java
  • 数组切片算法

    题目如下:就是一个数组,切三刀,从这三个切口组成的四个切片的整数和是否能够四等分,如果可以,就返回true,不行就返回false。

    主要的思路就是记着三个切点为m1,m2,m3(和是不包括m1 m2 和m3的),则先找m1,m2,头尾的和相等后,记为count,利用count以及m1,m3来查找m2。其中的细节在于,第一次找到的count不一定是对的,这样需要扩大count 继续寻找。具体代码如下。

    代码实现如下

     1 package p2;
     2 
     3 public class ali {
     4 
     5     // 数组切片。
     6     public boolean   fun (int [] A){
     7         int len=A.length;
     8         if(len<=3) return false;
     9         int i=0;int j=len-1;
    10         int count1=A[i];
    11         int count2=A[j];
    12         boolean check;
    13         while(i<j){
    14             if(count1<count2){
    15                 i++;
    16                 count1+=A[i];
    17             }
    18             if(count1>count2){
    19                 j--;
    20                 count2+=A[j];
    21             }
    22             else{
    23                 i++;
    24                 j--;
    25                 check=check( A,i,j,count1);
    26                 if(check){   //如果找到了m2 直接返回true
    27                     return check;
    28                 }
    29                 else{
    30                     count1+=A[i];  //如果找不到符合条件的m2 则增大count 继续查找
    31                     count2+=A[j];
    32                     
    33                 }
    34             }
    35             
    36         }
    37         return false;
    38     }
    39     public boolean check(int [] A,int i,int j,int sum){
    40           int l =i+1;
    41           int r=j-1;
    42           int left=A[l],right =A[r];
    43           while(l<r){
    44               if(left<right){
    45                   l++;
    46                   left+=A[l];
    47               }
    48               if(left>right){
    49                   r++;
    50                   right+=A[r];
    51               }
    52               else if(left==right){
    53                   if(left==sum&&r-l==2){   //注意这里的条件 找到的r 和l相当于m2+1和m2-1 相差2这个条件需要满足
    54                       return true;
    55                   }
    56                   if(left<sum){   //如果比传进来的sum小的话就增加和
    57                       l++;left+=A[l];
    58                       r--;right+=A[r];
    59                   }
    60                   else return false;  //都不满足的话 就就表示无法找到 可能需要增加上一级的count或者是不满足条件了。
    61               }
    62           }
    63         return false;
    64         
    65     }
    66 }
  • 相关阅读:
    XAMPP安装过程中,出现的问题
    Javascript的数据类型和转换
    Vue组件之间的通信
    vue2.0在页面中自定义组件模块,以及页面与组件之间的数据传递
    本地起一个https服务器
    开发人员初始化操作
    添加环境变量
    公钥~gitlab~免密登录
    class继承随笔
    阿里云ECS随笔
  • 原文地址:https://www.cnblogs.com/CongLollipop/p/6598897.html
Copyright © 2011-2022 走看看