java中列表的子列表

时间:2015-06-10 18:08:05

标签: java list sorting arraylist sublist

在一定的一维景观中有N栋建筑物。每个建筑物的高度由hi,i∈[1,N]给出。如果您加入K个相邻建筑物,它们将形成一个面积为K×min的实心矩形(hi,hi + 1,...,hi + k-1)。

鉴于N栋建筑物,找到连续建筑物形成的最大固体区域。

输入格式 第一行包含N,即建筑物的数量。 第二行包含N个以空格分隔的整数,每个整数代表建筑物的高度。

输出格式 一个整数,表示形成的矩形的最大区域。

示例输入

5
1 2 3 4 5

示例输出

9

这是我的代码,我试图交叉检查它,但它有一个问题,每当我访问一个子列表,它会自动排序,他们的位置在原始列表中被更改

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

 public class Solution 
{
 public static void main(String[] args) 
 {
   Scanner sc = new Scanner(System.in);
   int n=sc.nextInt();

   List<Integer> al= new ArrayList<Integer>();

    for(int i=0;i<n;i++)
        al.add(sc.nextInt());

  int i, c,min=0;

  for( c = 0 ; c < n ; c++ )
  {

     for( i = c+1 ; i <= n ; i++ )
     {   
         System.out.println(" value of c is "+c+" value of i is "+i);
         List<Integer> X = al.subList(c,i);

         for(int j=0;j<X.size();j++)
             System.out.print(X.get(j)+" ");

         System.out.println();

         Collections.sort(X);

         for(int j=0;j<X.size();j++)
             System.out.print(X.get(j)+" ");

         System.out.println();

         int x=X.get(0);
         System.out.println("min value is "+x);
         int y=x*(X.size());
         System.out.println("projected value is "+y);

         if(y > min)
             min = y;

         System.out.println("modified value is "+min);

      }
   }

    System.out.println(min);
  }
}

1 个答案:

答案 0 :(得分:1)

实际上已明确记录了subList()方法,以便为您提供原始的视图

  

返回指定列表中此列表部分的视图        * {@code fromIndex},包含在内,{@ code toIndex},独家。 (如果        * {@code fromIndex}和{@code toIndex}相等,返回的列表是        * empty。)返回的列表由此列表支持,因此非结构化        *返回列表中的更改将反映在此列表中,反之亦然。        *返回的列表支持所有可选的列表操作。

因此,如果您想修改subList()并且不将更改反映回原始版本,则它不适用。

而是制作一份明确的副本:

List<Integer> X = new ArrayList<>(al.subList(c,i));