算法笔记 --- 最短子数组

对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度。

给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的长度。(原序列位置从0开始标号,若原序列有序,返回0)。保证A中元素均为正整数。

#include <iostream>
#include <vector>
using namespace std;

class Subsequence {
public:
    int shortestSubsequence(vector<int> A, int n) {
        int var_max = A[0];
        int var_min = A[n-1];
        int index1 = 0, index2 = 0;
        for(int i = 1; i < n; i++){
            if(A[i] >= var_max){
                var_max = A[i];
            }else{
                index1 = i;
            }
        }
        for(int i = n-2; i >=0; i--){
            if(A[i] <= var_min){
                var_min = A[i];
            }else{
                index2 = i;
            }
        }
        if(index1 == 0 && index2 == 0){
            return 0;
        }
        return (index1-index2+1);
    }
};
int main()
{

    vector<int> A;
    //1,4,6,5,9,10
    A.push_back(1), A.push_back(4), A.push_back(6), A.push_back(5), A.push_back(9), A.push_back(10);
    Subsequence sorter;
    int res = sorter.shortestSubsequence(A, 6);

    cout<<res<<endl;

    return 0;
}
时间: 2024-10-12 08:57:35

算法笔记 --- 最短子数组的相关文章

算法 | 最大连续子数组

最大连续子数组 给定一个数组A[0,1,-,n-1],求A的连续子数组,使得该子数组的和最大. 例如: 数组:1,-2,3,10,-4,7,2,-5 最大字数组:3,10,-4,7,2 此问题有以下四种方法 1.  暴力法 2.  分治法 3.  分析法 4.  动态规划法 暴力法 直接求解A[I,-j]的值,其中,0<=i<n,i<=j<n,因为i,i+1,-j的最大长度为n,所以时间复杂度O(n3). //暴力法 int MaxSubArray(int *a, int n) {

排序练习题(五):最短子数组

对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度. 给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的长度.(原序列位置从0开始标号,若原序列有序,返回0).保证A中元素均为正整数. 测试样例: [1,4,6,5,9,10],6 返回:2 public class Subsequence { public int shortestSubsequence(int[] A, int n) { // write code here int max = A[0],min

和至少为K的最短子数组

返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 1: 输入:A = [1], K = 1 输出:1 示例 2: 输入:A = [1,2], K = 4 输出:-1 示例 3: 输入:A = [2,-1,2], K = 3 输出:3 1 <= A.length <= 50000 -10 ^ 5 <= A[i] <= 10 ^ 5 1 <= K <= 10 ^ 9 这道题的关键在于我们要知道各个区间的

[算法]最大连续子数组和,最长重复子串

这两道题是我在面试中亲身经历的,在面试滴滴的过程中,我遇到过最大子数组和,在面试阿里的过程中,我遇到过最长重复子串. 1. 最大子数组和 比如,给定一个数组, 1, -2, 3, -4, 5, 6, -7 应该输出, 11. public static int maxSubArray(int[] arr) { int max = Integer.MIN_VALUE; int k = Integer.MIN_VALUE; for (int i = 0; i < arr.length; i++) {

算法学习笔记:最大连续子数组

寻找最大连续子数组 这两天看了看数据结构与算法,对其中一个问题颇感兴趣,所以在这里写一下.问题:寻找最大连续子数组. 问题:在一个有正有负的数组中,寻找一个连续的.和最大的子数组.这个数组类似于下面的数组,否则这个问题没有意义(如果全是正数的话,所有数组元素的和一定是最大的,同样全为负数也没有意义.). int a={1,-2,3,45,-78,34,-2,6}; 解法一:暴力求解. 那么如何来解决这个问题呢?这个思路要起来并不难,绝大多数人会想到这样的办法:遍历该数组的所有子数组,找到和最大的

[LeetCode] Shortest Unsorted Continuous Subarray 最短无序连续子数组

Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too. You need to find the shortest such subarray and output its length. E

算法练习——和最接近于零的子数组

问题描述: 求对于长度为N的数组A,求子数组的和接近0的子数组,要求时间复杂度O(NlogN) (1) 求出所有的sum[i]  sum[i]表示A的前 i 项和 (2) 对sum[-1,0,...,N-1]排序,然后计算sum相邻元素的差的绝对值,最小记为 min1   (3) min1 : 在A中任意取两个相邻子数组的和,求两者差的最小值.(相当于 i--j和的最小值)(4) min2 : A的前k个元素的和的绝对值的最小值(为sum[0,1....n-1]中的最小值)(5) min1和mi

【算法30】从数组中选择k组长度为m的子数组,要求其和最小

原题链接:codeforce 267 Div2 C 问题描述: 给定长度为n的数组a[],从中选择k个长度为m的子数组,要求和最大. 形式描述为:选择$k$个子数组[$l_1$, $r_1$], [$l_2$, $r_2$], ..., [$l_k$l1, $r_k$] (1 ≤ $l_1$ ≤$r_1$ ≤$l_2$ ≤ $r_2$ ≤... ≤$l_k$ ≤ $r_k$ ≤ n; $r_i-r_i+1$), 使得$\sum_{i=1}^{k}\sum_{j=l_i}^{r_i}p_j$ 问题

Leetcode 581.最短无序连续子数组

最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: [2, 6, 4, 8, 10, 9, 15] 输出: 5 解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序. 说明 : 输入的数组长度范围在 [1, 10,000]. 输入的数组可能包含重复元素 ,所以升序的意思是<=. 题目给了我们一个nums array,