如何优化该解决方案? (在给定范围内剪切数组的特定部分)

时间:2019-02-28 03:45:40

标签: java algorithm data-structures

我给了一个数字列表,给了一个数字N,从列表的中心切出N个数字。因此,如果列表为:

1 2 3 5 7 11 13 17 19

并且N = 3,输出将是:

5 7 11

或者如果列表是:

1 2 3 5 7 11 13 17

并且N = 4,则输出将是:

3 5 7 11

我当前的解决方案是O(N ^ 2)(或者至少我认为是?Idk,如果嵌套的for循环意味着这是O(N ^ 2)),则在数字数组上进行迭代直到从开始到i的数字数量==从(数组的大小-(i +剪切大小))开始的数字数量。因为中间的切口意味着切口的左侧与右侧的切口数量相同。

“ nums”是我在中间找到切线的数字数组。

        int rightof = 0;
        ArrayList<Integer> cut = new ArrayList<Integer>();
        for (int i = 0; i < nums.size(); i++) {
            rightof = nums.size() - (i + cutsize);
            if (i == rightof && i != 0) {
                for (int j = i; j < (cutsize + i); j++) {
                    cut.add(nums.get(j));
                }
                break;
            }
        }

让这种情况变慢的是将适当的数字添加到“ cut”数组中。因此,我不确定如何优化该步骤。

2 个答案:

答案 0 :(得分:3)

Java 8流api使此操作相当容易。要跳过的元素数是大小减去n除以2,并限制为n个元素。

List<Integer> cut = Arrays.asList(1, 2, 3, 5, 7, 11, 13, 17, 19);
int n = 3;
int sk = (cut.size() - n) / 2;
List<Integer> al = cut.stream().skip(sk).limit(n).collect(Collectors.toList());
System.out.println(al);

答案 1 :(得分:2)

了解sublist()的力量:

List<T> result = arr.subList((arr.size()+1)/2 - arr.size()/4, arr.size()/2 + arr.size()/4);

arr是您的List

示例:

List<Integer> arr = Arrays.asList(1, 2, 3, 5, 7, 11, 13, 17);
arr.subList((arr.size()+1)/2 - arr.size()/4, arr.size()/2 + arr.size()/4)
   .forEach(System.out::println);

输出:

3
5
7
11

如果您只想通过简单的循环来做到这一点:

List<Integer> list = new ArrayList<>();
int size = arr.size();
for(int i = (size+1)/2-size/4; i < size/2+size/4; i++) {
    list.add(arr.get(i));
}