天天看點

傳回一個整數數組最大子數組的和

第一種算法(很麻煩)

設計思想:

1.通過随機數産生十個數。

2.聲明一些變量,包括:

flag —— 用來控制子數組的長度,從一到十遞增。

sum —— 記錄最大子數組的和,初始值為a[0]。

s_temp —— 記錄不斷更新的子數組的和。

3.通過一個while語句和兩個for循環實作。需注意第二個for循環中,為防止數組越界,使用Math.min方法。

源代碼:

int a[] = new int[10];
		for(int i = 0;i < 10;i++){
			a[i] = (int)(Math.random() * 20 - 10);   // 産生的随機數範圍在-9 ~ 9
		}
		System.out.print("産生的随機數的值為:");
		for(int i = 0;i <10;i++){
			System.out.print(a[i] + " ");
		}
		System.out.print("\n");
		
		int sum = a[0],s_temp = 0,flag = 1;
		while(flag < 10){
			for(int j = 0;j < 10;j++){
				s_temp = 0;
				for(int k = j;k < Math.min(j+flag,10);k++){
					s_temp = s_temp + a[k];
				}
				if(s_temp > sum){
					sum = s_temp;
				}
			}
			flag++;
		}

		System.out.println("最大子數組的和為:" + sum);
		
	}
      

  

運作結果:

傳回一個整數數組最大子數組的和

第二種方法:

當我們加上一個正數時,和會增加;當我們加上一個負數時,和會減少。是以,當接下來的和使現在的和更小時,抛棄它。當目前的和大于最大值,更新最大值。

1         int a[] = new int[10];
 2         for(int i = 0;i < 10;i++){
 3             a[i] = (int)(Math.random() * 20 - 10);   // 産生的随機數範圍在-9 ~ 9
 4         }
 5         System.out.print("産生的随機數的值為:");
 6         for(int i = 0;i <10;i++){
 7             System.out.print(a[i] + " ");
 8         }
 9         System.out.print("\n");
10         int sum = a[0],s_temp = a[0];
11         for(int i = 1 ;i < 10;i++){
12             s_temp = s_temp + a[i];
13             if(s_temp < a[i]){
14                 s_temp = a[i];16             }
17             if(s_temp > sum){
18                 sum = s_temp;21             }
22         }
23         
24         System.out.println("最大子數組的和為:" + sum);