面试算法题总结(二)

求子数组的最大和:
     输入一个整形数组,数组里有正数也有负数。数组中连续 的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
  例如:输入的数组为1,-2,3,10,-4,7,2,-5;和最大的子数组为3,10,-4,7,2;因此输出为该子数组的和18。

 

    解决方法如下:

import java.util.Scanner; public class Test { /** * 计算前几个数的和,如果小于零则重新赋值,置为下一个元素; * 当b > sum时,更新sum的值; * 当b < sum时,sum保持不变。 * * @param num 数组 * @return 所有子数组的和的最大值 */ public static int maxSum(int[] num) { int sum = 0; int b = 0; //针对所有数都为负数的情况 int temp = num[0]; for (int i = 1; i < num.length; i++) { if (temp < num[i]) temp = num[i]; } if (temp < 0) return temp; //针对普通情况,数组中不全为负数 for (int i = 0; i < num.length; i++) { if (b <= 0) b = num[i]; else b += num[i]; if (sum < b) sum = b; } return sum; } public static void main(String[] args) { System.out.print("请输入多个整数(以逗号分开):"); Scanner scanner = new Scanner(System.in); String[] numbers = scanner.nextLine().split(","); int[] parent = new int[numbers.length]; for (int i = 0; i < numbers.length; i++) parent[i] = Integer.parseInt(numbers[i]); System.out.println("所有子数组的和的最大值:" + maxSum(parent)); } }

你可能感兴趣的:(算法,String,面试,Class,import,Numbers)