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

题目:

给定一个无序数组,求出需要排序的最短子数组的长度。

例如: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记录最左边出现这种情况的位置。如果遍历完成后,noMinIndex的值依然为-1,说明从右向左始终不升序,原数组本来就有序,直接返回0,即完全不需要排序。

接下来从左向右遍历,遍历的过程记录左侧出现过的数的最大值。记为max。假设当前数为arr[i],如果arr[i]<max,说明如果排序,max的值必然会挪到arr[i]的右边。用变量moMaxindex记录最右边出现这种情况的位置。

遍历完后,arr[noMinIndex…noMaxIndex]是真正需要排序的部分。返回它的长度即可。

程序:

public static int getMinLength(int[] arr) {
        if (arr == null || arr.length < 2) {
            return 0;
        }
        int min = arr[arr.length - 1];
        int noMinIndex = -1;
        for (int i = arr.length - 2; i != -1; i--) {
            if (arr[i] > min) {
                noMinIndex = i;
            } else {
                min = Math.min(min, arr[i]);
            }
        }
        if (noMinIndex == -1) {
            return 0;
        }
        int max = arr[0];
        int noMaxIndex = -1;
        for (int i = 1; i != arr.length; i++) {
            if (arr[i] < max) {
                noMaxIndex = i;
            } else {
                max = Math.max(max, arr[i]);
            }
        }
        return noMaxIndex - noMinIndex + 1;
    }
时间: 2024-10-24 11:12:42

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

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

要求: 给定一个无序数组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 //从后往前找到最小值,并记

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

题目 需要排序的最短子数组长度 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-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&

给定一个无序数组arr,求出需要排序的最短子数组长度。例如: arr = [1,5,3,4,2,6,7] 返回4,因为只有[5,3,4,2]需要排序。

思路 首先从左往右遍历,然后设定一个Max,如果遍历的过程中array[i]大于Max,则置换Max,若小于Max,则指定 k 记录该位置. 然后再从右往左遍历,设定一个Min,在遍历的过程中array[i]小于Min,则置换Min,若大于Min,则指定 j 记录该位置. 于是 j~~k之间的就是需要排序的. 如上例,Max首先是1,然后遍历 Max=1,array[i]=1,置换Max,Max=1 Max=1,array[i]=5,置换Max,Max=5 Max=5,array[i]=3,k指

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

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

第二章 排序 || 第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 sta

[Swift]LeetCode862. 和至少为 K 的最短子数组 | Shortest Subarray with Sum at Least K

Return the length of the shortest, non-empty, contiguous subarray of A with sum at least K. If there is no non-empty subarray with sum at least K, return -1. Example 1: Input: A = [1], K = 1 Output: 1 Example 2: Input: A = [1,2], K = 4 Output: -1 Exa

微软算法100题03 求子数组的最大和

3.求子数组的最大和题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18 思路:使用辅助变量max 记录子数组的最大和,从数组头开始遍历,如果数组元素与之前的总和的sum是负数,则重置sum结果为零,否则将得到的sum值与max比较 如果小于ma

编程算法 - 连续和最大的子数组 代码(C)

连续和最大的子数组 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 在一个数组中, 找出连续和最大的子序列. 使用两个变量, 一个变量存储当前值, 一个变量存储最大值, 并设一个临时数组, 用于更新最大和数组. 时间复杂度O(n). 代码: /* * main.cpp * * Created on: 2014.9.19 * Author: spike */ #include <iostream> #include <vector&g