zoukankan      html  css  js  c++  java
  • 个人作业3-数组(带子问题,首尾相连)

    问题为:就是在前面数组的基础上将数组收尾相接,仍求连续子数组的和最大值。

    解决这个问题的关键就是理清思路,其实它就是相当于在原来数组的最后一位上接了前面几个数字,比如原来为3 -2 5 -1,然后首尾相接以后变成了 3 -2 5 -1 3 -2 5,这时候可以将其组合成一个新数组,

    int[] array3=new int[2*n-1];
    		
    		for(int j=0;j<n;j++) {
    			array3[j]=array[j];
    					}
    		for(int i=n;i<2*n-1;i++)
    		array3[i]=array[i-n];
    		for(int i=0;i<2*n-1;i++) {
    			System.out.print(array3[i]+" ");
    		}
    		System.out.print("
    ");
    

     然后要注意新的数组求出来的最大连续子数组的长度不能超过原来数组的长度,本例即4.

    if((max<sum)&&(j-i+1<=n)) {
    				max=sum;
    			}
    

     然后在原来的基础上加上这两步即可

    package array;
    
    import java.util.Scanner;
    
    import java.io.*;
    import java.math.BigDecimal;
    
    public class array1 {
    
    	
    	public static void main(String[] args) {
    		// TODO 自动生成的方法存根
    		Scanner sc=new Scanner(System.in);
    		System.out.println("请输入数组的长度");
    		int n=sc.nextInt();
    		int array[]=new int[n];
    		int array2[]=new int[n];
    		System.out.println("请依次输入数组的每个值");
    		for(int i=0;i<n;i++) {
    			 array[i]=sc.nextInt();
    		}
    		for(int i=0;i<n;i++) {
    			array2[i]=0;
    		}
    		int max;
    		int[] array3=new int[2*n-1];
    		
    		for(int j=0;j<n;j++) {
    			array3[j]=array[j];
    					}
    		for(int i=n;i<2*n-1;i++)
    		array3[i]=array[i-n];
    		for(int i=0;i<2*n-1;i++) {
    			System.out.print(array3[i]+" ");
    		}
    		System.out.print("
    ");
    		for(int i=0;i<n;i++) {
    			max=array3[i];
    			int sum=0;
    			System.out.print("abc"+max+" ");
    			for(int j=i;j<2*n-1;j++) {
    				sum=sum+array3[j];
    			if((max<sum)&&(j-i+1<=n)) {
    				max=sum;
    			}
    			}
    				array2[i]=max;	
    				System.out.println("def"+max);
    		} 
    		int k=array2[0];
    		for(int i=0;i<n;i++) {
    			System.out.println("ghi"+array2[i]);
    		}
    		for(int i=0;i<n;i++) {
    			if(array2[i]>k) {
    				k=array2[i];
    			}
    		}
    				
    		/*1 2 3 4 5 1 2 3 4
    		 * n+n-1
    		 *6 -7 9 -3 5
    		 * 1 1+n
    		 * 2 2+n
    		 * 1 2 3 4 1 2 3
    		 * 2 3 4 1
    		 * 3 4 2 1
    		 * */
    		System.out.println("最大值"+k);
    	}
    	}
    	
    	
    

     总结:

    这个题并不难可是自己却并没有在规定的时间内完成,主要原因是忽略了一个细节

    for(int i=0;i<n;i++) {    /*虽然首尾相接了,并把它放到了一个新的数组里,但是实际上数组并没有扩大,所以仍然是循环N次。*/
                max=array3[i];
                int sum=0;
                System.out.print("abc"+max+" ");
                for(int j=i;j<2*n-1;j++) {
                    sum=sum+array3[j];
                if((max<sum)&&(j-i+1<=n)) {
                    max=sum;
                }
                }
                    array2[i]=max;    
                    System.out.println("def"+max);
            }

    以后在遇到此类问题时一定要先理清思路再下手,切不可没有想好就开始做。

  • 相关阅读:
    Codeforces 1062
    HDU 1247
    力扣 7. 整数反转
    力扣 3. 无重复字符的最长子串
    力扣1. 两数之和
    力扣 78.子集
    C++编译时报错“count”符号不明确
    Java邻接矩阵存储图简易版以及深度优先优先遍历和广度优先遍历
    word中超链接显示成{HYPERLINK "url"}形式的解决方案
    Hadoop在window上运行出现:java.io.IOException: (null) entry in command string: null chmod 0644
  • 原文地址:https://www.cnblogs.com/zzstdruan1707-4/p/10588785.html
Copyright © 2011-2022 走看看