返回一个整数数组中最大子数组的和

1.要求:将数组看成环,求最大子数组

做法:求出最小子数组,用所有数的和减去最小子数组即为所求

package zhang;

import java.util.Scanner;
import java.math.*;

public class zz {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a[]=new int[100];
        int start=0,finish=0,sum=0;
        int min=a[0],s=a[0];
        int n,i;  
        Scanner in=new Scanner(System.in);
        n = in.nextInt();
        for(i=0;i<n;i++)
        {
            a[i]=in.nextInt();
        }
        for(i=0;i<n;i++)
        {
            sum+=a[i];
        }
        for(i=0;i<n;i++)
        {
            if(i == 0)
            {
                if(a[i]+a[n-1-i]<a[i])
                    a[i]=a[i]+a[n-i-1];
            }
            else
            {
            if(a[i]+a[i-1]<a[i])
                a[i]=a[i]+a[i-1];
            }
        }
        int ans=100000;
        for(i=0;i<n;i++)
            ans = Math.min(ans,a[i]);
        System.out.println("最大子数组的和是:"+(sum-ans));
        
    }
}

2.要求在文件中读取

package zm;

 

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.io.Reader;

import java.util.Arrays;

import java.util.Random;

 

public class game {

 

    public static int random(int num1, int num2) {

        Random random = new Random();

        return (Math.abs(random.nextInt()) % (num1 - num2)) + num1;

    }

 

    public static class Result {

        public int left;

        public int right;

        public int sum;

    }

 

    public static void main(String[] args) {

 

        

          String filepath = "F:\\java\\zm\\a.txt"; File file = new File(filepath); 
          try {

          PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "gbk"))); 
          Random random = new Random(); 
          
          for(int i = 0; i < 1000; i++) { 
              int n = random(-100, 100);
              writer.write(Integer.toString(n) + " "); 
              } 
          
          writer.flush(); 
          writer.close();

          }catch (Exception e) { e.printStackTrace(); }

         

 

        String filepath1 = "F:\\java\\zm\\a.txt";

        File file1 = new File(filepath1);

        int[] data = null;

        try {

            Reader reader = new InputStreamReader(new FileInputStream(file));

            BufferedReader bf = new BufferedReader(reader);

            String textline = "";

            String str = "";

            while ((textline = bf.readLine()) != null) {

                str += " " + textline;

            }

            String[] arr = str.split(" ");

            data = new int[arr.length];

            for (int i = 1; i < data.length; i++) {

                data[i] = Integer.valueOf(arr[i]);

            }

        } catch (Exception e) {

        }

        int low = 0, high = data.length - 1;

        Result result = find_maximun_subarray(data, low, high);

        System.out.print("最大连续子数组为:[");

        for (int i = result.left; i <= result.right; i++) {

            if (i == result.right) {

                System.out.println(data[i] + "]");

            } else {

                System.out.print(data[i] + ",");

            }

        }

        System.out.println("最大值为:" + result.sum);

    }

 

    public static Result find_maximun_subarray(int[] a, int low, int high) {

        Result leftres = new Result();

        Result rightres = new Result();

        Result crossres = new Result();

        if (low == high) {

            Result result = new Result();

            result.left = low;

            result.right = high;

            result.sum = a[low];

            return result;

        }

 

        int mid = (low + high) / 2;

        leftres = find_maximun_subarray(a, low, mid);

        rightres = find_maximun_subarray(a, mid + 1, high);

        crossres = find_max_crossing_subarray(a, low, mid, high);

        if (leftres.sum > rightres.sum && leftres.sum > crossres.sum) {

            return leftres;

        } else if (rightres.sum > leftres.sum && rightres.sum > crossres.sum) {

            return rightres;

        } else {

            return crossres;

        }

    }

 

    public static Result find_max_crossing_subarray(int[] a, int low, int mid, int high) {

        int left_sum = -1;

        int max_left = 0;

        int right_sum = -1;

        int max_right = 0;

        int sum = 0;

        for (int i = mid; i >= 0; i--) {

            sum += a[i];

            if (sum > left_sum) {

                left_sum = sum;

                max_left = i;

            }

        }

        sum = 0;

        for (int j = mid + 1; j < high; j++) {

            sum += a[j];

            if (sum > right_sum) {

                right_sum = sum;

                max_right = j;

            }

        }

        Result result = new Result();

        result.left = max_left;

        result.right = max_right;

        result.sum = left_sum + right_sum;

        return result;

    }

 

}

 

 

学习时参考了https://blog.csdn.net/weixin_39637376/article/details/89422901的回答,我认为他写博客的方式也值得学习

 

posted @ 2020-02-27 16:29  藻类植物  阅读(124)  评论(0编辑  收藏  举报