zoukankan      html  css  js  c++  java
  • 数组的子数组和最大值

    题目:

    输入一个一维整形数组,数组里有正数也有负数。 一维数组首尾相接,象个一条首尾相接带子一样。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。

    程序设计思想:求循环数组的子数组和的最大值,求子数组循环到数组第一个元素,另外定义一个素组长度为原来数组的两倍,定义和m为0,依次加上数组元素,定义最大值max,判断max与m大小,m比max大的话,m的值赋给max。循环先从下标0开始,循环一个数组长度后,再从下标1开始,循环终止于开始位置的前一个元素,循环开始的位置依次增加,知道数组的最后一个位置截止。

    出现的问题:一次循环截止的条件刚开始写的j=k 发现出现数组下标越界的情况,改成j=k-1发现多加了元素,最后想到改为 j=k-1+s。

    源代码

    package ER;
    
    import java.util.Scanner;
    
    public class Text {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		//数组长度
    		int k;
    		System.out.println("请输入数组长度");
    		Scanner in=new Scanner(System.in);
    		k=in.nextInt();
    		int a[]=new int[k];
    		//输入数组的元素
    		System.out.println("输入数组的元素");
    		for(int i=0;i<k;i++){
    			int n;
    			n=in.nextInt();
    			a[i]=n;
    		}
    		int m = 0;
    		int max = 0;
    		int g=0;
    		int l;
    		l=2*k;
    		//循环定义b数组长度为a的两倍
    		int b[]=new int[l];
    		for(int e=0;e<l;e++){
    			if(e!=k){
    				b[e]=a[e];
    			}
    			if(e==k){
    				for(int r=0;r<k;r++){
    					b[r+k]=a[r];
    					e++;
    				}
    			}
    		}
    		//计算子数组和的最大值
    		int s=0;
    		int j;
    		for(j=0;j<k+s;j++){
    			m+=b[j];
    			if(m>max){
    				max=m;
    			}
    			if(j==k-1+s){
    				s++;
    				if(s<k){
    					j=s-1;
    					m=0;
    				}
    				else
    					break;
    			}
    			
    		}
    		System.out.println("数组的最大子数组的和为:"+max);
    		
    		
    	}
    
    }
    

      

  • 相关阅读:
    数据库
    java语法
    《Lucene实战(第2版)》 配书代码在IDEA下的编译方法
    lucene学习
    社交关系调研(费)
    微博开发平台java SDK demo学习之examples(demo)
    微博开发平台java SDK demo学习之friendships
    F. Classical? (数论 + 思维 + 推理 + 容斥)
    石子合并问题,经典区间DP
    luoguP2048 [NOI2010]超级钢琴
  • 原文地址:https://www.cnblogs.com/zhouzh/p/6652910.html
Copyright © 2011-2022 走看看