【发布时间】:2019-08-23 15:13:59
【问题描述】:
我需要根据第二个数组列表的每个元素左循环旋转一个数组列表,然后返回另一个列表,该列表具有旋转后的数组列表的最大元素索引。 (每次旋转都应该在原来的arraylist形成上进行)
例如我有这两个数组列表:rotatelist[1,2,3,4],rotate[1,2,3]
流程是:
rotatelist[1,2,3,4],rotate[1] -> [2,3,4,1] : max element index= 2
rotatelist[1,2,3,4],rotate[2] -> [3,4,1,2] : 最大元素索引= 1
rotatelist[1,2,3,4],rotate[3] -> [4,3,2,1] : 最大元素索引= 0
下面的代码可以正常工作,但是当一个测试用例的数组列表元素大小达到大约 100,000 时,总是会显示“由于超时而终止”错误,因为我在 HackerRank 上运行它
List<Integer> indices = new ArrayList<>(rotate.size());
for(int i=0;i<rotate.size();i++){
//rotate arraylist to the left
Collections.rotate(rotatelist,-rotate.get(i));
//get and insert max element index to array
indices.add(rotatelist.indexOf(Collections.max(rotatelist)));
//rotate back to previous positions
Collections.rotate(rotatelist,rotate.get(i));
}
return indices;
那么还有其他方法可以优化这段代码的性能吗?
在性能方面,使用传统的 for 循环是否比使用 Collections.rotate() 更好?
【问题讨论】:
-
你能不能 a) 将所有旋转组合成一个旋转,b) 计算最大元素的索引 once 然后做一些简单的算术来生成另一个要返回的集合元素?
标签: java arraylist circular-buffer