如何优化此解决方案?(切割阵列的特定部分给定边界)



我给了我一个数字列表,并给出了一个数字,从列表的中心删除了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,如果嵌套为循环意味着这是o(n^2)),我在数字数组上迭代直到从开始到i的数字==数量来自数量的数量(数组的大小 - (i cut size))。因为中间的切口意味着切割的左侧与右侧有相同数量的数字。

" 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;
            }
        }

放慢速度的东西是将适当的数字添加到"切割"数组中。因此,我不确定如何优化该步骤。

Java 8流API使它变得相当容易。跳过的元素数是尺寸减去n除以两个,并限制为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);

学习 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));
}

最新更新