【问题标题】:Sublists of a list in javajava中列表的子列表
【发布时间】:2015-06-10 18:08:04
【问题描述】:

在某个一维景观中有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);
  }
}

【问题讨论】:

    标签: java list sorting arraylist sublist


    【解决方案1】:

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

    返回此列表在指定之间的部分的视图 * {@code fromIndex}(包含)和 {@code toIndex}(不包含)。 (如果 * {@code fromIndex} 和 {@code toIndex} 相等,返回的列表是 * 空。)返回的列表是由这个列表支持的,所以是非结构性的 * 返回列表中的更改会反映在此列表中,反之亦然。 * 返回的列表支持所有可选的列表操作。

    所以 subList() 不适合如果你想修改它并且不将更改反映回原来的。

    改为显式复制:

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

    【讨论】:

    • 您建议我在使用后清除子列表,还是不需要,因为我们再次声明它会自动清除它?
    • @coder101 不知道你在问什么。由于新 ArrayList 的构造函数只能访问从“al”创建的子列表,因此无法清除它(也不需要,将其留给 GC)。或者您是在问重用 ArrayList X 吗?你可以这样做(在循环之前创建 X,然后使用 clear() 和 addAll(subList) 而不是 new),但再次不需要无缘无故地让它变得更复杂。
    • 在循环中创建 X 和在循环之前创建 X 有什么区别,执行时间更短? Collections.sort() 方法花费了很多时间来执行,但是当我使用 for 循环来查找最小值时,它通过了更多的测试用例,但不是全部你有什么建议?由于超时(超过 4 秒),它没有通过所有测试用例
    • @coder101 如果是关于性能,这取决于。我不相信 resue 会给你带来更好的表现——但尝试总比猜测好。如果您需要将执行时间降低 一个数量级,您实际上需要改进计算方法。
    • 当我在循环之前创建 X 时,它显示 IndexOutOfBoundsException 错误
    猜你喜欢
    • 2013-01-14
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    相关资源
    最近更新 更多