📌  相关文章
📜  大小为 K 的子数组的计数,它是从 1 到 K 的数字排列

📅  最后修改于: 2021-10-26 06:21:43             🧑  作者: Mango

给定一个不同整数的数组arr ,任务是找到大小为i的子数组的计数,其中所有元素从1 到 i ,换句话说,子数组是从1 到 i的元素的任何排列,其中1 < = i <= N

例子:

一种朴素的方法是从每个索引开始,尝试找到每个 size(i) 的子数组,并检查从 1 到 i 的所有元素是否都存在。
时间复杂度:O(N 2 )

通过检查是否可以为 i 从1 到 N 的每个值创建大小为i的子数组,可以给出一种有效的方法
我们知道,每个大小为K 的子数组都必须是从1 到 K的所有元素的排列,知道我们可以按顺序查看从1 到 N的数字的索引,并计算出每个元素的最小值和最大值的索引步。

  • 如果maximum_ind – minimum_ind + 1 = K ,那么我们有大小为 K 的排列,否则没有。
  • 在每一步更新 minimum_ind 和 maximum_ind 的值。

时间复杂度: O(n)
插图:

下面是上述方法的实现:

C++
// C++ program to implement
// the above approach
 
#include 
#include 
#include 
using namespace std;
 
int find_permutations(vector& arr)
{
    int cnt = 0;
    int max_ind = -1, min_ind = 10000000;
    int n = arr.size();
    unordered_map index_of;
 
    // Save index of numbers of the array
    for (int i = 0; i < n; i++) {
        index_of[arr[i]] = i + 1;
    }
 
    for (int i = 1; i <= n; i++) {
 
        // Update min and max index
        // with the current index
        // and check if it's a valid permutation
        max_ind = max(max_ind, index_of[i]);
        min_ind = min(min_ind, index_of[i]);
        if (max_ind - min_ind + 1 == i)
            cnt++;
    }
 
    return cnt;
}
 
// Driver code
int main()
{
    vector nums;
    nums.push_back(2);
    nums.push_back(3);
    nums.push_back(1);
    nums.push_back(5);
    nums.push_back(4);
 
    cout << find_permutations(nums);
 
    return 0;
}


Java
// Java program to implement
// the above approach
import java.util.*;
 
class GFG{
     
public static int find_permutations(
    Vector arr)
{
    int cnt = 0;
    int max_ind = -1, min_ind = 10000000;
    int n = arr.size();
     
    HashMap index_of = new HashMap<>();
             
    // Save index of numbers of the array
    for(int i = 0; i < n; i++)
    {
        index_of.put(arr.get(i), i + 1);
    }
 
    for(int i = 1; i <= n; i++)
    {
         
        // Update min and max index with
        // the current index and check
        // if it's a valid permutation
        max_ind = Math.max(max_ind, index_of.get(i));
        min_ind = Math.min(min_ind, index_of.get(i));
         
        if (max_ind - min_ind + 1 == i)
            cnt++;
    }
    return cnt;
}
 
// Driver Code
public static void main(String[] args)
{
    Vector nums = new Vector();
    nums.add(2);
    nums.add(3);
    nums.add(1);
    nums.add(5);
    nums.add(4);
     
    System.out.print(find_permutations(nums));
}
}
 
// This code is contributed by divyeshrabadiya07


Python3
# Python3 program to implement
# the above approach
def find_permutations(arr):
     
    cnt = 0
    max_ind = -1
    min_ind = 10000000;
     
    n = len(arr)
    index_of = {}
 
    # Save index of numbers of the array
    for i in range(n):
        index_of[arr[i]] = i + 1
 
    for i in range(1, n + 1):
 
        # Update min and max index with the
        # current index and check if it's a
        # valid permutation
        max_ind = max(max_ind, index_of[i])
        min_ind = min(min_ind, index_of[i])
         
        if (max_ind - min_ind + 1 == i):
            cnt += 1
             
    return cnt
 
# Driver code
if __name__ == "__main__":
 
    nums = []
    nums.append(2)
    nums.append(3)
    nums.append(1)
    nums.append(5)
    nums.append(4)
 
    print(find_permutations(nums))
 
# This code is contributed by chitranayal


C#
// C# program to implement
// the above approach
using System;
using System.Collections;
using System.Collections.Generic;
 
class GFG{
     
static int find_permutations(ArrayList arr)
{
    int cnt = 0;
    int max_ind = -1, min_ind = 10000000;
    int n = arr.Count;
     
    Dictionary index_of = new Dictionary();
             
    // Save index of numbers of the array
    for(int i = 0; i < n; i++)
    {
        index_of[(int)arr[i]] = i + 1;
    }
 
    for(int i = 1; i <= n; i++)
    {
         
        // Update min and max index with
        // the current index and check
        // if it's a valid permutation
        max_ind = Math.Max(max_ind, index_of[i]);
        min_ind = Math.Min(min_ind, index_of[i]);
         
        if (max_ind - min_ind + 1 == i)
            cnt++;
    }
    return cnt;
}
 
// Driver Code
public static void Main(string[] args)
{
    ArrayList nums = new ArrayList();
 
    nums.Add(2);
    nums.Add(3);
    nums.Add(1);
    nums.Add(5);
    nums.Add(4);
 
    Console.Write(find_permutations(nums));
}
}
 
// This code is contributed by rutvik_56


Javascript


输出:
3