zoukankan      html  css  js  c++  java
  • go语言实现寻找最大子数组

    题目:给定一个数字序列,寻找其中各元素相加和最大的子数组

      1 /*
      2 寻找最大子数组go语言实现
      3 */
      4 
      5 package main
      6 
      7 import fmt "fmt"
      8 
      9 func main() {
     10     /*
     11     需要查找的数组
     12     */
     13     A:=[]int{-1,5,-3,-1,3,1,3}
     14     low:=0
     15     high:=len(A)-1
     16     sum:=0
     17     low,high,sum=find_max_array(A,0,len(A)-1)
     18     /*
     19     返回数组边界
     20     */
     21     fmt.Println(low," ",high," ",sum)
     22 }
     23 /*
     24 返回越过中间点的最大数组
     25 */
     26 func Find_max_acrossing(Array []int,low int,mid int,high int)(int,int,int) {
     27     /*
     28     现设定左最小值,寻找左边最小数组边界
     29     */
     30     left_sum:=-1000
     31     sum:=0
     32     max_left:=mid
     33     for i := mid; i>=low; i-- {
     34         sum+=Array[i]
     35         if sum>left_sum {
     36             left_sum=sum
     37             max_left=i
     38         }
     39     }
     40 
     41     /*
     42     现设定右最小值,寻找右边最小数组边界
     43     */
     44     right_sum:=-1000
     45     sum=0
     46     max_right:=mid+1
     47     for i := mid+1; i <=high; i++ {
     48         sum+=Array[i]
     49         if sum>right_sum {
     50             right_sum=sum
     51             max_right=i
     52         }
     53     }
     54     return max_left,max_right,left_sum+right_sum
     55 }
     56 
     57 func find_max_array(Array []int,low int,high int)(int,int,int){
     58     max_left:=low
     59     max_right:=high
     60     sum:=0
     61     if low==high {
     62         max_left=low
     63         max_right=high
     64         sum=Array[high]
     65     }else{
     66         mid:=0
     67         if (high-low+1)%2==0 {
     68             mid=(high+low-1)/2
     69         }else{
     70             mid=(high+low)/2
     71         }
     72 
     73         max_left_low:=low
     74         max_left_high:=mid
     75         left_sum:=0
     76         max_left_low,max_left_high,left_sum=find_max_array(Array,low,mid)
     77 
     78         max_right_low:=mid+1
     79         max_right_high:=high
     80         right_sum:=0
     81         max_right_low,max_right_high,right_sum=find_max_array(Array,mid+1,high)
     82 
     83         max_across_low:=low
     84         max_across_high:=high
     85         across_sum:=0
     86         max_across_low,max_across_high,across_sum=Find_max_acrossing(Array,low,mid,high)
     87 
     88         if left_sum>right_sum && left_sum>across_sum{
     89             max_left=max_left_low
     90             max_right=max_left_high
     91             sum=left_sum
     92         }else if right_sum>left_sum && right_sum>across_sum {
     93             max_left=max_right_low
     94             max_right=max_right_high
     95             sum=right_sum
     96         }else if across_sum>left_sum && across_sum>right_sum {
     97             max_left=max_across_low
     98             max_right=max_across_high
     99             sum=across_sum
    100         }
    101     }
    102     return max_left,max_right,sum
    103 }
  • 相关阅读:
    Java语言
    Java面向对象编程思想
    final关键字
    abstract关键字
    对象初始化过程
    访问修饰符
    继承
    面向对象设计
    static
    封装
  • 原文地址:https://www.cnblogs.com/bindong/p/5871962.html
Copyright © 2011-2022 走看看