5-11阿里实习生笔试第一题

题目不难,我在这里分享一下自己的想法,欢迎大家指正并分享自己的解法。

题目: 有一个数组,可以从中取任意个元素,但是取出的数相邻两个数不能取出,编写一个程序,输入为数组长度N和数组,返回可以取出的最大值。
举例: 数组 a={1,2,3},可以取出的最大值为4


思路

用的是递归的解法,假设此时N-1个数的情况我们已经解决了,我们考虑第N个数要不要取:

  • 当N=1时,这没什么好说的,就只能取a[0]
  • 当N=2时,比较一下a[0]和a[1],哪个大取哪个
  • 当N>=3时,这时我们考虑第N个数,也就是a[N-1]要不要取。此时只要比较一下前面 N-1个数,我们取得的最大值,和前面 N-2个数我们取得的最大值+第N个数,哪个大我们取哪个。

JAVA代码

public static int solve(int N,int[] a) {
        if(N <= 0) { //如果N<=0,直接返回0
            return 0;
        }
        //N=1时
        if(N == 1) 
            return a[0];
        //N=2时
        if(N == 2) {
            return a[1]>a[0]? a[1]:a[0];
        }else if(N>=3) {
        // N=3时,我们比较前N-1时取得的最大值与前N-2个数的最大值+第N个数
            if(solve(N-1,a) > solve(N-2,a)+a[N-1]) {
                return solve(N-1,a);
            }else {
                return solve(N-2,a)+a[N-1];
            }
        }
        return 0;
    }

测例

懒人一个,没力去写scanner,直接手动测试(

int[] a = new int[] {2,1,3,7,5,2};
int t = solve(6,a);
System.out.print(t);

测试结果:
这里写图片描述
2+7+2=11,嗯,没毛病。

时间复杂度

这玩意说实话我并不擅长……根据递归式大概估计了一下,N=1和N=2时就是比较,常数O(1),主要是N>=3,每次递归只减少1或者2,所以复杂度大概是 Θ(n^2) 吧。。。。还是挺慢的,不知道大家有没有更好的解法分享一下,如果我的解法有什么错误也欢迎指正!

猜你喜欢

转载自blog.csdn.net/shibuyarin/article/details/80354713