5780. 删除一个元素使数组严格递增

510 阅读1分钟

前言

参加周赛做的第一题,emm,写了好久都过不了,哎,在此记录一下,希望能帮助理解 5780. 删除一个元素使数组严格递增

题意: image.png

解题思路

如果存在非递增的情况,从数组的排列上看,必有一个点使得向上的趋势往下坠落。即当遍历到下标i,有nums[i]<nums[i-1]时,对nums[i],nums[i-1],nums[i-2]三个数,此时分别有两种情况: 情况一: 当前数nums[i]<nums[i-1],但nums[i]大于nums[i-2],如下图中,5<10但5>2

image.png 针对这种情况,移除nums[i-1],但当遍历到i+1时,nums[i+1]仍然与nums[i]进行比较 情况二: 当前数nums[i]<nums[i-1],但nums[i]小于nums[i-2],如下图,4<10并且4<6

image.png 针对这种情况,只能移除nums[i],当遍历到i+1时,使得nums[i+1]与nums[i-1]进行比较

代码:

public boolean canBeIncreasing(int[] nums) {
        //用count表达向上的趋势往下坠落这种情况出现多少次
        int count = 0;
        //用tmp来保存上一个用于比较的数
        int tmp = nums[0];
        for (int i=1; i<nums.length; i++){
            if (nums[i] > tmp){
                tmp = nums[i];
            }else {
                count ++;
                if (i>1 &&nums[i]<=nums[i-2]){
                    //相当于删除nums[i]
                    tmp = nums[i-1];
                }else {
                    //tmp依旧置为当前数,相当于删除nums[i-1]
                    tmp = nums[i];
                }
            }
        }
        return count <= 1;
    }