关于求已知整数数组的连续子数组的最大和的方法 ——基于一维数组的循环,甚至推广到二维情况上

日期:2019.3.21 

博客期:047 

星期四

  先二话不说,先交代码,今天训练的内容是“这个整数数组是允许开头和结尾结合在一起的”,大家的思路都是扩大数组内容,就是将读入的数据存入数组,并将数据量扩大一倍——把开头和结尾相连!

  我仔细一想这也可以啊!但是当老师讨论到数组位数的时候,他说最多设置位数不超过 2N-1 (N是原数组的位数),这里我想如果取全部的数据该怎么办?

  实例: 1,2,-3,2,0 

  按照以前的算法应该取得 1,2 ,得到结果 3

  按照新算法得到 2,0,1,2 ,得到结果 5

  但是大家说的算法是连接数组,也就是得到新数组 1,2,-3,2,0,1,2,-3,2 ;从而算得结果为 5 ,但是如果全部是正数呢?应该加以判断?

  实例2:10, -20, 25, -50 ,15

  得到结果应该是取得 15,10,-20,25 ,得到结果30

  

  1 package pvp;
  2 
  3 import java.io.File;
  4 import java.io.FileNotFoundException;
  5 import java.util.Scanner;
  6 
  7 public class TestPlay4 {
  8     public static void main(String[] args) {
  9         //AddRandomNumber.Renew3();
 10         File f = new File("data/data.txt");
 11         if(!f.exists())
 12         {
 13             System.out.println("文件不存在!");
 14             System.exit(0);
 15         }
 16         //存储导入内容
 17         String str;
 18         //内容
 19         Scanner sc = null;
 20         try {
 21             sc = new Scanner(f);
 22         } catch (FileNotFoundException e1) {
 23             System.out.println("文件不存在!");
 24             System.exit(0);
 25         }
 26         //最大值
 27         int rmax = Integer.MIN_VALUE;
 28         //正数总值
 29         int Tnum = Integer.MIN_VALUE;
 30         //负数总值
 31         int Fnum = 0;
 32         //记录是否发生转变
 33         int sis = 0;
 34         //标记是第几程度
 35         int attitude = 0;
 36         //------------------------<Test4新加内容>
 37         //标记从第1个开始数的最大值
 38         int isState = 0;
 39         //标记从第1个开始数的最小值
 40         int isNotState = 0;
 41         //内容标记
 42         int kort = 0;
 43         //从第1个开始数的最大值的位置
 44         int u_er = 0;
 45         //从第1个开始数的最小值的位置
 46         //int v_er = 0;
 47         //------------------------</Test4新加内容>
 48         //循环
 49         try
 50         {
 51             //--------------------[Test4新加内容]
 52             int p_num = 0;//------[Test4新加内容]
 53             //--------------------[Test4新加内容]
 54             if(!sc.hasNext())
 55             {
 56                 System.out.println("文件内容为空!");
 57                 System.exit(0);
 58             }
 59             while(sc.hasNext())
 60             {
 61                 ++p_num;
 62                 int p;
 63                 str = sc.next();
 64                 p = Integer.parseInt(str);
 65                 if(attitude==0)                    //---------------------------------------[寻找第一个正数]
 66                 {
 67                     if(p<=0)
 68                         ;
 69                     else
 70                     {
 71                         Tnum = p;
 72                         attitude = 1;
 73                     }
 74                 }
 75                 else if(attitude==1)            //---------------------------------------[上一个数为正数]
 76                 {
 77                     if(p<0)
 78                     {
 79                         if(sis==0)
 80                         {
 81                             sis = 1;
 82                             Fnum += p;
 83                         }
 84                         else
 85                             Fnum = p;
 86                         attitude = -1;
 87                     }
 88                     else
 89                         Tnum += p;
 90 
 91                     if(Tnum>rmax)
 92                         rmax = Tnum;
 93                 }
 94                 else                            //---------------------------------------[上一个数为负数]
 95                 {
 96                     if(p>0)
 97                     {
 98                         attitude = 1;
 99                         if(Tnum + Fnum > 0)
100                         {
101                             if(Tnum + Fnum > Integer.MAX_VALUE - p)
102                             {
103                                 System.out.println("统计内容超过最大值!");
104                                 System.exit(0);
105                             }
106                             Tnum = (Tnum + Fnum) + p;
107                         }
108                         else
109                             Tnum = p;
110                     }
111                     else
112                     {
113                         if(Fnum<Integer.MIN_VALUE-p)
114                         {
115                             System.out.println("统计内容超过最小值!");
116                             System.exit(0);
117                         }
118                         Fnum += p;
119                     }
120                 }
121                 if(p>rmax)
122                     rmax = p;
123                 if(Tnum>rmax)
124                     rmax = Tnum;
125                 
126                 kort = kort + p;
127                 
128                 if(isState<kort)
129                 {
130                     isState = kort;
131                     u_er = p_num;
132                 }
133                 if(isNotState>kort&&p_num>=u_er)
134                     isNotState = kort;
135                 else if(p_num<u_er)
136                     isNotState = 0;
137             }
138             //--------------------[Test4新加内容]
139             if(kort-isNotState+isState>rmax)
140                 rmax = kort-isNotState+isState;
141             //--------------------[Test4新加内容]
142         }
143         catch( NumberFormatException e){
144             System.out.println("输入内容不是数字或者过大!");
145             System.exit(0);
146         }
147         System.out.println(rmax);
148         sc.close();
149     }
150 }
TestPlay4.java

猜你喜欢

转载自www.cnblogs.com/onepersonwholive/p/10574554.html
今日推荐