yabanbingliang 发表于 2020-6-1 10:12:58

用贪心算法求解一个问题

本帖最后由 yabanbingliang 于 2020-6-1 10:14 编辑

请使用贪心算法解决下列问题
求解一个序列中出现次数最多的元素
【问题描述】给定n个正整数,编写程序找出它们中出现次数最多的数,如果这样的数有多个,输出其中最小的数。

有没有大佬!帮俺康康{:10_266:}

java2python 发表于 2020-6-1 11:10:51

这本来是个O(n)的问题,用词典:整数值:次数。。。就行了
非得贪心算法,真是个难题,不知道怎么贪心,一般贪心是针对o(n的n次方)

Darth_EF 发表于 2020-6-1 11:44:50

本帖最后由 Darth_EF 于 2020-6-1 12:47 编辑

// javascript
      var n=233;                  // n
      var arr=new Array(n);   
      for(var i=n-1;i>=0;--i){   //用随机数填充数组内容
            arr=Math.floor(Math.random()*10);
      }

      var _v_s=[];
      for(var i=n-1;i>=0;--i){    //记录某数字出现的次数
            var j;
            for(j=_v_s.length-1;j>=0;--j){
                if(_v_s.value==arr){
                  _v_s.sum+=1;
                  break;
                }
            }
            if(j==-1)_v_s.push({value:arr,sum:1});
      }

      tempValue=v_s;
      for(var i=v_s.length-2;i>=0;--i){
            if(tempValue.sum<v_s.sum){
                tempValue=v_s;
            }else{
                if(tempValue.sum==v_s.sum.value>v_s.value){tempValue=v_s;}
            }
      }
      console.log(v_s);
      console.log(tempValue);

很菜,不知道贪心算法怎么写;由于我这里没装c的环境所以是用js写的,换成c也差不多。支持楼上

yabanbingliang 发表于 2020-6-1 12:59:06

java2python 发表于 2020-6-1 11:10
这本来是个O(n)的问题,用词典:整数值:次数。。。就行了
非得贪心算法,真是个难题,不知道怎么贪心,一 ...

我也不想用贪心啊{:10_266:}可这是实验的题目{:10_266:}

yabanbingliang 发表于 2020-6-1 13:00:12

Darth_EF 发表于 2020-6-1 11:44
很菜,不知道贪心算法怎么写;由于我这里没装c的环境所以是用js写的,换成c也差不多。支持楼上

谢谢你{:5_109:}我研究研究

赚小钱 发表于 2020-6-1 15:36:32

本帖最后由 赚小钱 于 2020-6-1 15:37 编辑

去学一下数据结构: 堆

使用数据结构
struct Elem {
    int value;
    int times;
}
作为元素,构建一个最大堆。算法满足贪心算法的思想。时间复杂度为 O(n)。

405794672 发表于 2020-6-1 17:16:08

首先感谢,让我又看到个新名词:贪心算法!去查了下资料,对于它的讲解。个人感觉和遍历,穷举没什么区别

soupman 发表于 2020-6-1 19:31:31

i dont know that whether i didis greedy algorithm ,but maybe it can dislove your problem

#include<iostream>
#include<cstdio>
using namespace std;
int func(int a[],int n,int hash[],int &i,int &imax){
    if(n==1){
      imax=0;
      i=a;
      hash]=1;
      return 1;
    }else{
         int k=-1;
         k=func(a,n-1,hash,i,imax);
         ++hash];//把当前的值压入哈希,判断上一层传递过来的次数与当前次数比较
         if(hash]>k){//当前层大于上一层的最多次数 ,更新imax,返回次数
             imax=n-1;
            return hash];
         }else if(hash==k]){//次数一样时
            if(a<a){
                  imax=n-1;//更新
                return hash];//返回最多次数
            }
         }
    }
}
int main(){
    int n=6,i=-1,imax=-1;
    int hash={0};
    int a={1,2,2,2,1,1};
    func(a,6,hash,i,imax);
    cout<<a<<endl;
}

页: [1]
查看完整版本: 用贪心算法求解一个问题