码迷,mamicode.com
首页 > 编程语言 > 详细

数组切片算法

时间:2017-03-22 11:27:29      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:als   技术   span   []   pack   count   amp   组成   ret   

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

 

数组切片算法

标签:als   技术   span   []   pack   count   amp   组成   ret   

原文地址:http://www.cnblogs.com/CongLollipop/p/6598897.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!