3802.消灭数组-AcWing题库

这篇博客探讨了一种编程问题,即如何处理非降序数组,目标是找到在一系列消除操作后,数组能保留的最大长度。作者提出了使用递归和二分查找模板来解决这个问题,并给出了具体的时间和空间复杂度分析。代码示例中展示了如何实现这个算法,通过不断比较和消除数组部分来达到升序排列。
摘要由CSDN通过智能技术生成

作者 : Xia Xinyu
日期 : 2021-08-13

原题链接

题目 :给定一个长度为 n 的数组,如果它不是非降序的,那么就将它的前半部分或后半部分消灭。

不断重复这个消灭一半数组的过程,直至数组变为升序为止。

请问,得以幸存的数组的最大可能长度是多少?

输入格式
第一行包含整数 T,表示共有 T 组测试数据。

每组数据第一行包含整数 n。

第二行包含 n 个整数 a1,a2,…,an,表示给定数组。

输出格式
输出幸存数组的最大可能长度。

数据范围
1≤T≤10,
1≤n≤16,n 保证是 2 的整数次幂。
1≤ai≤100。

输入样例:

3
4
1 2 2 4
8
11 12 1 2 13 14 3 4
4
7 6 5 4

输出样例:

4
2
1

思路:若当前数组是不是非降序的,我们就分别处理这个数组的前半部分和后半部分,所以这个问题可以分解为不同子问题,所以使用递归来处理,递归部分代码使用常用二分模版。

二分算法模版点这里

import java.util.*;
public class Main{
    public static int is_incre(int[] a,int l,int r){
        int mid = (l + r) / 2;
        boolean flag = true;
        for(int i = l + 1;i <= r;i++){
            if(a[i - 1] > a[i]) flag = false;
        }
        if(flag) return r - l + 1;
        else return Math.max(is_incre(a,mid + 1,r),is_incre(a,l,mid));
    }
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();
        while(T-- != 0){
            int n = in.nextInt();
            var a = new int[n];
            for(int i = 0;i < n;i++) a[i] = in.nextInt();
            int ans = 0;
            int l = 0,r = n - 1;
            System.out.println(is_incre(a,l,r));
        }
    }
}

时间复杂度: O(n * lgn)(遍历数组 * 二分求解区间)

空间复杂度:O(n * lgn)(每次递归的空间复杂度n * 递归深度lgn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XiaXinyuuu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值