返回一个整数数组中最大子数组的和
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的回答,我认为他写博客的方式也值得学习