首页 > 其他分享 >求数组中的最大子数组的和--相关测试

求数组中的最大子数组的和--相关测试

时间:2023-03-06 20:11:31浏览次数:40  
标签:arr 数组 -- int length 测试 new Scanner

测试一:在普通的数组里面求最大子数组的和

首先给出一个普通数组的定义,然后循环遍历,为数组的n个元素赋值;

然后再根据a[i]+a[i-1]>a[i]的条件是否成立,来进行加和运算,然后赋值记录;

最后循环遍历已经加和完成的数组,数值最高的那个元素值,就是本数组的最大子数组的和

#include<iostream>
using namespace std;
int main() {
	int a[1000];
	int i;
	int n;

	cin >> n;
	for (i = 1; i <= n; i++) {
		cin >> a[i];
	}

	//判断最大子数组的和
	for (i = 2; i <= n; i++) {
		if (a[i] + a[i - 1] > a[i]) {
			a[i] = a[i] + a[i - 1];
		}
	}

	int max = -1;
	for (i = 1; i <= n; i++) {
		if (a[i] >= max) {
			max = a[i];
		}
	}

	cout <<"最大值为:" << max << endl;
}

和这个:

public class test {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int length;
        int []arr=new int[1000];

        //输入相关数值
        length=sc.nextInt();
        for(int i=0;i<length;i++){
            arr[i]=sc.nextInt();
        }

        //计算和比较
        int max=arr[0];

        for(int i=1;i<length;i++){
            if(arr[i]+arr[i-1]>arr[i]){
                arr[i]=arr[i]+arr[i-1];
            }
        }

        //得到结果
        for(int i=0;i<length;i++){
            if(arr[i]>=max){
                max=arr[i];
            }
        }

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

    }
}

上面是我的初遍稿子,也就是用到了纯纯地扫描数组的方法;(虽然遭到了质疑和否定,但我下课之后还是去百度了这种方法,发现还是有相关的肯定的),真正的扫描法,具体如下:

public class test {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int length;
        int []arr=new int[1000];

        //输入相关数值
        length=sc.nextInt();
        for(int i=0;i<length;i++){
            arr[i]=sc.nextInt();
        }

        //计算和比较
        int sum=arr[0];
        int res=0;

        for(int i=1;i<length;i++){
            if(sum<0){
                sum=arr[i];
            }else{
                sum+=arr[i];
            }

            res=max(res,sum);
        }

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

    }

    public static int max(int x,int y){
        if(x<=y){
            return y;
        }else{
            return x;
        }
    }
}

测试二:将数组改为循环数组,继续求其最大子数组的和

所谓循环数组,就是让两个相同的数组首尾相接,长度由原来的n变为后来的2n

还需要新增加一个判断条件,子数组的长度不能超过原来的数组的长度n

具体代码如下:

//数组变为首尾相接数组,继续求其最大子数组的和
public class test {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int length;
        int []arr=new int[1000];

        //输入相关数值
        length=sc.nextInt();
        for(int i=0;i<length;i++){
            arr[i]=sc.nextInt();
        }

        //计算和比较
        int sum=arr[0],b=arr[0],x=0,y=0;
        //其中,x代表最大子数组的右边界,y代表最大子数组的左边界
        int j=1;
        while((j-x)<length&&x<length){
            if(b>0){
                b=arr[j%length];
                if(j<length){
                    x=j;
                }else{
                    break;
                }
            }else{
                b+=arr[j%length];
            }

            if(sum>b){
                sum=b;
                y=j;
            }
            j++;
        }

        //求最大值
        sum=0;
        for(int i=y+1;i<x+length;i++){
            sum+=arr[i%length];
        }

        System.out.println("该首尾相接的数组的最大的子数组的和为:"+sum);

    }
}

标签:arr,数组,--,int,length,测试,new,Scanner
From: https://www.cnblogs.com/liuzijin/p/17134259.html

相关文章

  • synchronized保证线程安全
    packagecom.Java;//银行不安全案例两个人同时取钱//使用synchronized和synchronized块可以锁住对象保证线程的安全性publicclassTestBank{publicstaticvoid......
  • MongoDB :第三章:MongoDB的数据类型与创建MongoDB数据库
    元数据数据库的信息是存储在集合中。它们使用了系统的命名空间:dbname.system.*在MongoDB数据库中名字空间.system.*是包含多种系统信息的特殊集合(Collection),如下:......
  • 3.6课堂练习
    packageketang01;importjava.util.Scanner;/***贪心算法*@authorLenovo**/publicclassc1{privatestaticScannerscan;publicstaticvoidmain(S......
  • [工具/软件]开源爬虫框架
    0概述1JavaSpiderspider-flowHomeURL:https://www.spiderflow.org/spider-flow是一个爬虫平台,以图形化方式定义爬虫流程,无需代码即可实现一个爬虫Githu......
  • 集合没有指明泛型,获取数据需要强转
      Listlist=newArrayList(); list.add(2); list.add(1); list.remove(1);//1  Iteratorit=list.iterator();//2 while(it.hasNext()){//3......
  • cs144Lab总结
    CS144Lab总结我不明白,我就是不明白,面试官说的话我一点都不明白。面试官说好的东西,到底怎么好我不明白,不明白,我不明白。套接字(socket)到底有什么用的,套接字,到底有什么好,我......
  • 1599. 经营摩天轮的最大利润 (Medium)
    问题描述1599.经营摩天轮的最大利润(Medium)你正在经营一座摩天轮,该摩天轮共有4个座舱,每个座舱最多可以容纳4位游客。你可以逆时针轮转座舱,但每次轮转都需要......
  • 网上购书系统二次开发
    项目来源:大一下学期同学C++大作业项目,做的是一个网上购书系统开发,功能如下书籍信息显示客户信息显示选购书籍结算总额订单显示使用说明退出系统页面端项目......
  • 牛客网 Mysql【入门】
    牛客网Mysql【入门】如果select语句同时包含有groupby,having,limit,orderby那么他们的顺序是:where(限制属性)groupby(分组)having(筛选)orderby(排序)limit(分页【......
  • huggingface三种添加模型的方法
    首先搞清楚预训练模型一般会有的文件:vocab.txtconfig.jsonpytorch_model.bin这三个分别对应tokenizer,config和model。添加huggingfacehub里面的模型只要有模型名......