找数组的i,j(j>i)使得a[j] - a[i]的值最大(算法)

来源:互联网 发布:淘宝店铺的层级 编辑:程序博客网 时间:2024/05/16 04:39

这是一个面试题。

数组a[0..n-1],找出i和j使得a[j] - a[i]的值最大。

注意j > i。

要求是时间复杂度O(n),空间复杂度O(1)。

先贴一个代码,我觉得应该还能简化以下,但是时空复杂度还是满足要求的。欢迎讨论,更好的办法。


两个for循环嵌套了,用平摊法可以得到,复杂度不是O(n^2),而是O(n)


#include <stdio.h>int a[10] = {6, 5, 4, 8, 1, 8, 0, 6, 9, 4};int main(){        int  i, j, k;        int max = 1, min = 0, min2 = 0;               i = min;        k = min;        for (j = 1; j < 9; j++)        {                if (a[j + 1] > a[max])                {                        max = j + 1;                        for (; i < max; i++)                        {                                if (a[i] < a[min])                                        min = i;                        }                }                else if(a[j + 1] <= a[max])                {                        for ( ;k <= j; k++)                        {                                if (a[k] < a[min2])                                        min2 = k;                        }                        if (a[j + 1] - a[min2] > a[max] - a[min])                        {                                max = j + 1;                                min = min2;                        }                }        }        printf("%d, %d\n", max, min);        return 0;}


原创粉丝点击