• 个人作业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;
    	}
    	
    	
    }
     */
    }
    

      

    运行结果:

    迷失在灿烂之中 消失在万里晴空
  • 相关阅读:
    转:HTTP Get请求URL最大长度
    Android Paint Xfermode 学习小结
    转:Android-apt
    ajax方法携带授权标识
    获取iframe(angular 动态页面)高度
    IIS下配置跨域设置Access-Control-Allow-Origin
    Oracle 创建 Schema
    定时任务服务 CronService使用说明
    使用ADO.NET执行SQL脚本
    Nuget很慢,我们该怎么办
  • 原文地址:https://www.cnblogs.com/wxy2000/p/10506716.html
Copyright © 2020-2023  润新知