2020第十一届蓝桥杯省赛校内模拟赛试题

6.递增三元组

/**
 问题描述
   在数列 a[1], a[2], ..., a[n] 中,如果对于下标 i, j, k 满足 0 
  

 

算法思想:dp思想,维护两个数组,min[n]和max[n]。分别存储第i个元素之前的最小元素和最大元素,只需要当前元素与min和max数组比较就可以求得是否满足递增三元组的条件。时间复杂度控制在O(n)

话不多说,上代码。

算法思想没有问题,时间复杂度也是最优,可能有些小问题,没有检查出来,如果有错欢迎指正。

public class 递增三元组 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int len=sc.nextInt()+1;
        int[] nums = new int[len];
        for (int i = 1; i < len; i++) {
            nums[i]=sc.nextInt();
        }
        int[] min = new int[len];
        int[] max = new int[len];
        //初始化赋值,第一个元素前面最小元素值为第一个元素本身(方便第二个元素判断)
        min[1]=nums[1];
        min[2]=nums[1];
        //初始化赋值,最后一个元素后面最大元素值为最后一个元素本身(方便倒数第二个元素判断)
        max[len-1]=nums[len-1];
        max[len-2]=nums[len-1];
        //由于第二个元素前面最小元素值已经求出来(为第一个元素的值),同理倒数第二个数之后最大元素的值为
        //倒数第一个数,所以直接跳过,从第3个数开始维护数组。
        for (int i = 3,j=len-3; i < len; i++,j--) {
            //维护最小最大值表,如果第i-1个数的值小于i-1前面所有数的最小值(这个值存放在min[i-1中]),
            // 则更新前i个数的最小值存放在min[i]中
            if (nums[i-1]max[j+1]) max[j]=nums[j+1];
            else max[j]=max[j+1];
        }
        //计数器
        int count=0;
        for (int i = 2; i nums[i]) {
                System.out.println(nums[i]);
                count++;
            }
        }
        System.out.println(count);
    }
}

 

你可能感兴趣的:(算法,动态规划,蓝桥杯)