如何利用C++、C、Python确定一个数组中满足给定约束的元素的索引

98 阅读1分钟

问题

给定一个整数数组,找出一个索引,在这个索引之前所有的元素都比它小,所有的元素都比它大。

输入样本

[1, 2, 2, 4, 6, 9,, 9]

输出样本

3 (0-based indexing)

方法

我们可以在这个问题上创建两个辅助数组。一个数组将存储每个索引左边的最大元素,第二个数组将存储每个索引右边的最小元素。如果我们找到一个索引,其左边的最大元素小于当前索引的元素,其右边的最小元素大于当前元素,我们就得到了答案。这种方法的时间复杂度是O(N),所需的辅助空间也是O(N)

C 编程

#include <stdio.h>
#include <limits.h>
 
int max(int x, int y) { return (x > y) ? x : y; }
int min(int x, int y) { return (x < y) ? x : y; }
 
int solve(int arr[], int n)
{

    int prefix[n];
 
    prefix[0] = INT_MIN;
 
    for (int i = 1; i < n; i++) {
        prefix[i] = max(prefix[i - 1], arr[i - 1]);
    }
 
    int suffix[n];
 
    suffix[n-1] = INT_MAX;
 
    for (int i = n - 2; i >= 0; i--) {
        suffix[i] = min(suffix[i + 1], arr[i + 1]);
    }
 

    for (int i = 1; i < n-1; i++)
    {

        if (prefix[i] < arr[i] && arr[i] < suffix[i]) {
            return i;
        }
    }
 
    return n;
}
 
int main()
{
    int arr[] = {1, 2, 2, 4, 6, 9, 9 };
    int n = sizeof arr / sizeof arr[0];
 
    int ans = solve(arr, n);
 
    if (ans >= 0 && ans < n) {
        printf("The index is %d", ans);
    }
    else {
        printf("Does not exists");
    }
 
    return 0;
}

输出

The index is 3

C++编程

#include <bits/stdc++.h>
using namespace std;
int solve(int arr[], int n)
{

    int prefix[n];
 
    prefix[0] = INT_MIN;
 
    for (int i = 1; i < n; i++) {
        prefix[i] = max(prefix[i - 1], arr[i - 1]);
    }
 
    int suffix[n];
 
    suffix[n-1] = INT_MAX;
 
    for (int i = n - 2; i >= 0; i--) {
        suffix[i] = min(suffix[i + 1], arr[i + 1]);
    }
 

    for (int i = 1; i < n-1; i++)
    {

        if (prefix[i] < arr[i] && arr[i] < suffix[i]) {
            return i;
        }
    }
 
    return n;
}
 
int main()
{
    int arr[] = {1, 2, 2, 4, 6, 9, 9 };
    int n = sizeof arr / sizeof arr[0];
 
    int ans = solve(arr, n);
 
    if (ans >= 0 && ans < n) {
        cout<<"The index is "<<ans;
    }
    else {
        cout<<"Does not exists";
    }
 
    return 0;
}

输出

The index is 3

Python编程

import sys
 
def solve(A):
 
    n = len(A)
 
    prefix = [None] * n
 
    prefix[0] = -sys.maxsize
 
    for i in range(1, n):
        prefix[i] = max(prefix[i - 1], A[i - 1])
 
    suffix = [None] * n
 
    suffix[n-1] = sys.maxsize
 

    for i in reversed(range(n - 1)):
        suffix[i] = min(suffix[i + 1], A[i + 1])
 

    for i in range(1, n-1):
        if prefix[i] < A[i] < suffix[i]:
            return i
    return n
 
A = [1, 2, 2, 4, 6, 9, 9 ]
 
ans = solve(A)
if 0 <= ans < len(A):
    print("The index is", ans)
else:
    print("Does not exists")

输出

The index is 3