Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1006556
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: C/C++

2012-10-29 15:16:50

求数组中重复元素出现最多,值最大的元素,次数相同时,取最大值,优先考虑次数。

例如:{5,3,5,1,2,4,3,4}; 返回5.

Update: 2013.Jan.4th 增加简化后的代码。

这个题方法倒是很快想出来,但是细节很有些不一样的地方,错了好几次。给出的应该是最复杂的一种输入形式。

考虑设置两个函数
g(n),表示数组中的元素input[n],到n为止,input[n]重复出现的次数。
例如给出的输入,g(2) = 2.因为数组的下标为2的数是5,到这个数为止,5是第2次出现,所以g(2) = 2;

f(n)表示到n为止,重复次数最多,且值最大的那个数的下标。这里需要注意,我第一次f(n)直接选取的是这个数的值,并不是下标,这样就无法追踪到当前位置的数之前出现的次数了,所以是错的。只用通过下标,才能把它的数值和出现次数联系在一起。这个题目的最大的trick也就在这里。

假设f(n)已知,考虑f(n+1):
g(n+1)>g(n),即到n+1为止,下标n+1的数出现的次数是最多的。
     f(n+1) = n+1
g(n+1)     f(n+1) = f(n)
g(n+1)==g(n) n+1 和f(n) 两个数出现的次数相同,那么选择其中数值最大的那个。
     if(input[n+1] > input[f(n)])说明 n+1的值要大
           f(n+1) = n+1
     if(input[n+1] < input[f(n)])说明 n+1的值要小,f(n+1)不变
           f(n+1) = f(n)

 

复杂度分析:

g(n)和f(n)的复杂度都是O(n),所以结果就是O(2n),不知道能不能把它减到O(n)

点击(此处)折叠或打开

  1. /*
  2.  * =====================================================================================
  3.  *
  4.  * Filename: test.c
  5.  *
  6.  * Description:
  7.  *
  8.  * Version: 1.0
  9.  * Created: 10/29/2012 11:06:16 PM
  10.  * Revision: none
  11.  * Compiler: gcc
  12.  *
  13.  * Author: royn.wang.renyuan@gmail.com (),
  14.  * Organization:
  15.  *
  16.  * =====================================================================================
  17.  */
  18. #include <stdlib.h>


  19. #include <stdio.h>
  20. #define MAX 1000000
  21. int test(int * input, int size){
  22.     int count[MAX] = {0};
  23.     int i = 0;
  24.     int DP1[MAX] = {0};
  25.     for(;i<size;i++){
  26.         count[input[i]] ++;
  27.         DP1[i] = count[input[i]];
  28.                  printf("DP2[%d] = %d \n", i,DP1[i]);

  29.     }
  30.     int DP2[MAX] = {0};
  31.     DP2[0] = 0;
  32.     for(i =1; i<size; i++){
  33.                  printf("DP2[%d] = %d \n", i-1,DP2[i-1]);
  34.         if(DP1[i] < DP1[DP2[i-1]]){
  35.             DP2[i] = DP2[i-1];
  36.             continue;
  37.         }
  38.         if(DP1[i] > DP1[DP2[i-1]]){
  39.             DP2[i] = i;
  40.             continue;
  41.         }
  42.         if(DP1[i] == DP1[DP2[i-1]] && input[i]>input[DP2[i-1]]){
  43.             DP2[i] = i;
  44.             continue;
  45.         }
  46.         DP2[i] = DP2[i-1];
  47.     }
  48.     return input[DP2[size-1]];
  49. }



  50. /*
  51.  * === FUNCTION ======================================================================
  52.  * Name: main
  53.  * Description:
  54.  * =====================================================================================
  55.  */
  56.     int
  57. main ( int argc, char *argv[] )
  58. {
  59.     int input[] = {5,3,5,1,2,4,3,4};
  60.     printf("%d\n", test(input, sizeof(input)/sizeof(int)));
  61. } /* ---------- end of function main ---------- */


 


 

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 1000

  4. int getNum(int *input, int size){
  5.     if(input == NULL) return -1;
  6.     int count[MAX] = {0};
  7.     int ret = 0;
  8.     int i;
  9.     for(i=0;i<size;i++){
  10.         count[input[i]]++;
  11.         if(count[input[i]]>count[input[ret]] ||
  12.                   (count[input[i]]==count[input[ret]] && input[i]>=input[ret]))
  13.             ret = i;
  14.         
  15.     }
  16.     return input[ret];
  17. }


  18. int main(){
  19.     int input[] = {5,3,5,1,2,4,3,4,4};
  20.     printf("%d \n", getNum(input,sizeof(input)/sizeof(int)));
  21. }


 

 

阅读(3340) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~