• Right Dominant Elements问题


    求解Right Dominant Elements问题

    针对下面两种情况,设计求解Right Dominant Elements的算法(一个序列中某元素比它的后面所有的数都大的元素即为Right Dominant Element),并分析算法的复杂度。
    
    例L=(10,9,5,13,2,7,1,8,4,6,3),答案为(13,8,6,3)。
    
    情况一:一次性给定n个数据。
    情况二:数据序列在线给定(数据不是一次性给定,而是边输入边求解)。

    情况一

    方法1:Simple

    Time Complexity: O(n*n)

     1 #include <stdio.h>
     2 #include <string.h>
     3 int RightDominantElement(const char array[], const int ArrayLength);
     4 
     5 int main(int argc, const char *argv[])
     6 {
     7     char a[1000] = {10,9,5,13,2,7,1,8,4,6,3,};            //一次性输入数据,共有11个有效数据 
     8     int   n      = strlen(a);                            //此时    n = 11 
     9     RightDominantElement(a,n);    
    10     return 0;
    11 } 
    12 
    13 int RightDominantElement(const char array[], const int ArrayLength)
    14 {
    15     int i, j;
    16     for(i=0; i<ArrayLength; i++)
    17     {
    18         for(j=i+1; j<ArrayLength; j++)
    19         {
    20             if(array[i] <= array[j])        //若array[i]后面有更大的数,该轮冒泡查找结束。开始下一轮冒泡。 
    21                 break;
    22         }
    23         if(j == ArrayLength)                //此时内层循环正常结束,未触发break语句,即array[i]后面没有更大的数。 
    24             printf("%d,",array[i]);
    25     }
    26     printf(" 
    ");                        //去掉最后一位的逗号, 
    27 }

    方法2:Scan from right

    Time Complexity: O(n)

    30 #include <stdio.h>
    31 void RightDominantElement(int array[], int Length);
    32 int main(int argc, const char *argv[])
    33 {
    34     int a[] = {10,9,5,13,2,7,1,8,4,6,};    //一次性输入数据,共有11个有效数据
    35     int n   = sizeof(a)/sizeof(a[0]);        //此时    n = 11 
    36     RightDominantElement(a,n);
    37     return 0;
    38 }
    39 
    40 void RightDominantElement(int array[], int Length)
    41 {
    42     int largest_index = Length-1;        // 数组最大下标 = 数组长度 - 1 
    43     int max_from_right = array[largest_index];    //设置从右数的第一个数为Right Dominant Element
    44     printf("%d ",max_from_right);
    45     for (int i=largest_index-1; i>=0; i--)        /*从右到左扫描数组中的所有元素,并一直跟踪到现在为止的最大值。 当最大值更改其值时,将其打印。*/ 
    46     {
    47         if(max_from_right < array[i])
    48         {
    49             max_from_right = array[i];
    50             printf("%d ",max_from_right);
    51         }
    52     }
    53 }

  • 相关阅读:
    FL2440-学习记录(二)
    FL2440-学习记录(三)
    C专家编程 第一章
    C陷阱与缺陷
    ARM体系结构与编程-第二章
    二叉堆 及 大根堆的python实现
    八皇后问题
    非递归全排列 python实现
    Python 学习
    poj1064 Cable master(二分查找,精度)
  • 原文地址:https://www.cnblogs.com/ytdyz/p/12352639.html
Copyright © 2020-2023  润新知