美文网首页js css html
【算法题】1574. 删除最短的子数组使剩余数组有序

【算法题】1574. 删除最短的子数组使剩余数组有序

作者: 程序员小2 | 来源:发表于2023-03-24 11:02 被阅读0次

题目:

给你一个整数数组 arr ,请你删除一个子数组(可以为空),使得 arr 中剩下的元素是 非递减 的。

一个子数组指的是原数组中连续的一个子序列。

请你返回满足题目要求的最短子数组的长度。

示例 1:

输入:arr = [1,2,3,10,4,2,3,5]
输出:3
解释:我们需要删除的最短子数组是 [10,4,2] ,长度为 3 。剩余元素形成非递减数组 [1,2,3,3,5] 。
另一个正确的解为删除子数组 [3,10,4] 。
示例 2:

输入:arr = [5,4,3,2,1]
输出:4
解释:由于数组是严格递减的,我们只能保留一个元素。所以我们需要删除长度为 4 的子数组,要么删除 [5,4,3,2],要么删除 [4,3,2,1]。
示例 3:

输入:arr = [1,2,3]
输出:0
解释:数组已经是非递减的了,我们不需要删除任何元素。
示例 4:

输入:arr = [1]
输出:0

提示:

1 <= arr.length <= 10^5
0 <= arr[i] <= 10^9

java代码:

class Solution { // 模板二
    public int findLengthOfShortestSubarray(int[] arr) {
        int n = arr.length;
        int i = 1, j = n-1;
        while (i<n && arr[i-1]<=arr[i]) ++i;
        if (i == n) return 0; // arr已经有序
        while (j-1>=0 && arr[j-1]<=arr[j]) --j;
        int l = j, r = n-1; 
        int ans = j; // 最坏结果只保留right
        for (int k = 0; k < i; ++k) {
            int target = arr[k];
            l = j; r = n; //搜索right区间[j,n-1]
            while (l<r) {
                int mid = (l+r)>>1;
                if (arr[mid] < target) {
                    l = mid+1;
                } else {
                    r = mid;
                }
            }
            ans = Math.min(ans, r-k-1);
        }
        return ans;
    }
}

相关文章

  • 【算法题】1574. 删除最短的子数组使剩余数组有序

    插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。[http...

  • 一道算法题之两个有序数组合并

    最近面试的时候遇到了一道算法题,两个有序数组合并,要求新的数组也是有序的 此题比较简单,主要是看数组元素进行对比,...

  • 88. Merge Sorted Array

    思路:有序数组合并,A,B数组依次比较大小,然后填入A数组,如果最后B数组有剩余,则填入A数组剩余部分。

  • 2.2.3 无序数组需要排序的最短子数组

    对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。 给定一个整数数组A及它的大小n,请返回最短子...

  • golang实现堆排序

    算法题:给定一个整型数组,将数组的中的元素按升序排序。 基本思路:操作:排序输入:无序整型数组输出:有序整型数组 ...

  • 双指针解法类型

    A1.删除有序数组中的重复项 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次...

  • 最小翻转数组

    问题描述 寻找数组的子数组,通过对该子数组进行排序,从而使得整个数组达到有序状态 算法1:确定边界法 首先确定子数...

  • 力扣-[简单]26. 删除有序数组中的重复项

    给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 ...

  • 删除排序数组中的重复项

    给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 ...

  • 删除排序数组中的重复项

    题目信息 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的...

网友评论

    本文标题:【算法题】1574. 删除最短的子数组使剩余数组有序

    本文链接:https://www.haomeiwen.com/subject/tjiwrdtx.html