数组切片算法
题目如下:就是一个数组,切三刀,从这三个切口组成的四个切片的整数和是否能够四等分,如果可以,就返回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 }