第二章 排序 || 第19节 最短子数组练习题

题目


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

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

[1,4,6,5,9,10],6

返回:2

解析

  • C++版
class Subsequence {
public:
    int shortestSubsequence(vector<int> A, int n) {
        // write code here
        int start=0;
        int end=n-1;
        //最右边比max值小的数的下标
        //最左边比min大的数的下标
        //测试用例:[1,2,10,1,8,9],6
        int max=A[0],min=A[n-1];//记录两边已经遍历过的极值
        for(int i=0;i<n;i++)
            if(A[i]<max)
                start=i;
            else
                max=(max>A[i])?max:A[i];
        for(int j=n-1;j>=0;j--)
            if(A[j]>min)
                end=j;
            else
                min=(min<A[j])?min:A[j];
        if(start<=end)
            return 0;
        else
            return start-end+1;
    }
};
  • 错误的思想:直接从左右两边逆序记录位置不对,需要找到全局极值
class Subsequence {
public:
    int shortestSubsequence(vector<int> A, int n) {
        // write code here
        int start=0;
        int end=n-1;
        for(int i=0;i<n-1;i++)
            if(A[i]>A[i+1])
            {
                start=i;
                break;
            }
        if(start==0&&A[n-2]<=A[n-1])
            return 0;
        for(int j=n-1;j>=start;j--)
        {
            if(A[j]<A[j-1])
            {
                end=j;
                break;
            }
        }
        int res=end-start+1;
        return res;
    }
};

测试用例:
[1,2,10,1,8,9],6

对应输出应该为:

5

你的输出为:

2

原文地址:https://www.cnblogs.com/ranjiewen/p/9281884.html

时间: 2024-08-29 01:53:52

第二章 排序 || 第19节 最短子数组练习题的相关文章

第二章 排序 || 第18节 有序矩阵查找练习题

题目 现在有一个行和列都排好序的矩阵,请设计一个高效算法,快速查找矩阵中是否含有值x. 给定一个int矩阵mat,同时给定矩阵大小nxm及待查找的数x,请返回一个bool值,代表矩阵中是否存在x.所有矩阵中数字及x均为int范围内整数.保证n和m均小于等于1000. 测试样例: [[1,2,3],[4,5,6],[7,8,9]],3,3,10 返回:false 解析 C++版 class Finder { public: bool findX(vector<vector<int> >

第2章 排序 || 第15节 有序数组合并练习题

题目 有两个从小到大排序以后的数组A和B,其中A的末端有足够的缓冲空容纳B.请编写一个方法,将B合并入A并排序. 给定两个有序int数组A和B,A中的缓冲空用0填充,同时给定A和B的真实大小int n和int m,请返回合并后的数组. 解析 class Merge { public: int* mergeAB(int* A, int* B, int n, int m) { // write code here while(n>0&&m>0) { if(A[n-1]>B[m

第2章 排序 | 第14节 重复值判断练习题

题目 请设计一个高效算法,判断数组中是否有重复值.必须保证额外空间复杂度为O(1). 给定一个int数组A及它的大小n,请返回它是否有重复值. 测试样例: [1,2,3,4,5,5,6],7 返回:true 解析 class Checker { public: bool checkDuplicate(vector<int> a, int n) { // write code here if(n<=1) return false; sort(a.begin(),a.end()); for(

需要排序的最短子数组长度

要求: 给定一个无序数组arr,求出需要排序的最短子数组长度 1 // getMinLength.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 7 using namespace std; 8 9 void getMinLength(int arr[],int len) 10 { 11 if(len == 0) 12 return; 13 14 //从后往前找到最小值,并记

2-1-需排序的最短子数组长度

题目描述: 对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度. 给定一个整数数组A及它的大小n,请返回最短子数组的长度. 测试样例: [1,5,3,4,2,6,7],7 返回:4 1 /* 2 这个题在牛客网上的讲解我感觉是有点问题的, 3 因为默认了升序排序! 4 如下实现对数组[8,7,6,5,4,3]的结果将会是6, 5 实际上此时的结果应该为0,因为现在已经是有序的了. 6 */ 7 #include <iostream> 8 #include <vector&

需要排序的最短子数组的长度——是一个排序好的数组,中间某一部分被打乱了,让你找出打乱的那个子数组

需要排序的最短子数组的长度 貌似在leetcode上遇到过,就是一个排序好的数组,中间某一部分被打乱了,让你找出打乱的那个子数组. from:https://blog.csdn.net/behboyhiex/article/details/80758686 [题目] 给定一个无序数组arr,求出需要排序的最短子数组长度. 例如: arr = [1, 5, 3, 4, 2, 6, 7]返回4,因为只有[5, 3, 4, 2]需要排序. [思路] 双指针 第一次从左向右遍历,找左边比当前位置大的 第

[算法]需要排序的最短子数组长度

题目: 给定一个无序数组,求出需要排序的最短子数组的长度. 例如:arr={1,5,3,4,2,6,7}返回4,因为只有[5,3,4,2]需要排序. 思路: 解决这个问题可以在时间复杂度为O(N).额外空间复杂度为O(1)完成. 初始化变量noMinIndex=-1,从右向左遍历,便利的过程记录右侧出现过的数的最小值,记为min.假设当前数为arr[i],如果arr[i]>min,说明如果要整体有序,min值必然会移到arr[i]的左边.用noMinIndex记录最左边出现这种情况的位置.如果遍

《程序员代码面试指南》第八章 数组和矩阵问题 需要排序的最短子数组长度

题目 需要排序的最短子数组长度 java代码 package com.lizhouwei.chapter8; /** * @Description: 需要排序的最短子数组长度 * @Author: lizhouwei * @CreateDate: 2018/4/29 8:03 * @Modify by: * @ModifyDate: */ public class Chapter8_5 { public int getMinLength(int[] arr) { if (arr == null

第2章 排序 | | 第17节 三色排序练习题

题目 有一个只由0,1,2三种元素构成的整数数组,请使用交换.原地排序而不是使用计数进行排序. 给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组.保证数组大小小于等于500. 测试样例: [0,1,1,0,2,2],6返回:[0,0,1,1,2,2] 解析 class ThreeColor { public: //思路有bug vector<int> sortThreeColor(vector<int> A, int n) { // write code here