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("\b \n"); //去掉最后一位的逗号, 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 }