java中列表的子列表

java中列表的子列表,java,list,sorting,arraylist,sublist,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 这是我的代码,我试图交叉检查它,但有一个问题,每当我访问一个子列表,它会自动

在某个一维景观中有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);
  }
}
import java.io.*;
导入java.util.*;
导入java.text.*;
导入java.math.*;
导入java.util.regex.*;
公共类解决方案
{
公共静态void main(字符串[]args)
{
扫描仪sc=新的扫描仪(System.in);
int n=sc.nextInt();
List al=新的ArrayList();
对于(int i=0;i而言,subList()方法实际上是显式记录的,以提供原始的视图:

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

因此,如果要修改subList()并且不将更改反映回原始内容,则它不适用

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

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

您建议我在使用子列表后清除它,还是在我们再次声明它时不需要它,这样它就会自动清除它?@coder101不确定您在问什么。由于新ArrayList的构造函数只能访问从“al”创建的子列表,因此无法清除它(也没有必要,把这件事交给GC去做)。或者你是想重用ArrayList X吗?你可以这样做(在循环之前创建X,然后使用clear()和addAll(subList)代替new),但同样不需要无缘无故地使它变得更复杂。在循环中创建X与在循环之前创建X有什么区别?在循环中创建X与在循环之前创建X相比,执行X所需的时间更少?Collections.sort()方法的执行花费了很多时间,但当我使用for循环来查找最小值时,它通过了更多的测试用例,但不是所有的测试用例。您的建议是什么?由于超时,它没有通过所有的测试用例(超过4秒)@coder101如果它是关于性能的,那就要看情况了。我不相信resue会给你带来更好的性能-但是尝试比猜测更好。如果你需要将执行时间减少一个数量级,你实际上需要改进计算方法。当我在循环之前创建X时,它向我展示了IndexOutofBoundsException错误