个人作业1——数组

题目:返回一个整形数组中最大子数组的和

要求:

  • 输入一个整形数组,数组中有正数也有负数。
  • 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
  • 求所有子数组的和的最大值,要求时间复杂度为O(n)

设计思路:

  • 方法一:用两个for循环返回最大子数组的和sum,与max比较,当sum>max时,交换值,最终返回max的值,但是时间复杂度达不到O(n)
  • 方法二;先遍历数组,找到第一个大于零的数star;从star开始利用for循环求出sum,当sum<0时,令sum=0继续循环;当最终出现sum=0的情况时,遍历一遍返回数组中最大的数(全是负数的情况下会返回0,应该返回最大的负数才对)。

遇到的问题:

  1. 开始运用方法二时,输入-8,9,0三个数时会返回1;后来加入star跳过前面的负数解决了此问题。
  2. 全输入负数会返回0;后来加入一段代码当max返回0时再求一遍数组中的最大值。

源代码

package q_002;
import java.util.Scanner;

public class q_1606{
	static Scanner sc=new Scanner(System.in);
	 static float d=Float.NEGATIVE_INFINITY;
	
public static void main(String[] args) {
	
	//输入数组长度
	int n;
	System.out.println("请输入数组的长度");
	n=sc.nextInt();

	//输入数组
    int[] a=new int [n];
	System.out.println("请输入"+n+"个 整数");
	for(int i=0;i<n;i++)
	{
		a[i]=sc.nextInt();
	}
	
	//显示数组内容
	System.out.println("输入的数组为:");
	for(int i=0;i<n;i++)
	{
		 System.out.println(a[i]+"  ");
	}
	/*int arr[] = { 2, -3, 4, 11, -5, 8, 3, -6 };*/
	
	//调用函数输出结果
    int maxSum = getMaxSum(a);
    System.out.println("最大子数组的和为:" + maxSum);
}





//方法一
private static int getMaxSum(int[] a) {
   
    int n = a.length;
   int max1 =(int) d;//令最大值等于无穷小
    for (int i = 0; i < n; i++) {
        int sum = 0;
        for (int j = i; j < n; j++) {
            sum += a[j];
            if (max1 < sum) {
                max1 = sum;
            }
        }
    }

    return max1;
}

// 方法二
private static int getMaxSum2(int[] a) {
    int n = a.length;
    int max =(int) d;
    int sum = 0;
   int star = 0;
    
 for (int j =0 ; j < n; j++) {//如果前面的数是负数则跳过
    	while(a[j]>0)
    	{
    		star=j;
    	}
    }
 
    for (int i=star ; i < n; i++) {
    	
        sum += a[i];
        if (sum > max) {
            max = sum;
        }
        if (sum < 0) {
            max = 0; // 子串和为负数,丢掉
        }
    }
  
    return max;
}

/*
 //方法三
private static int getMaxSum3(int[] a)
{
	int sum = 0;
	int max=-1000000;
	for(int i=0;i<arr.length;i++)
	{
		 sum += arr[i];
		 if(sum>max) {
			 max=sum;
		 }
	if(sum<0)
	{
		max=0;
	}
	return max;
	}
	
	
}
 */
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值