【力扣】面试经典150题——T169.多数元素

文章讲述了如何在给定数组中找到出现次数超过半数的多数元素。首先尝试了排序和冒泡/快速排序,但因时间复杂度过高而超时。最终通过使用哈希表实现,提高了查找效率,解决了超时问题。C语言和Java代码示例对比提供。
摘要由CSDN通过智能技术生成

题目:

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

思路:弄一个time数组,time[i]存nums数组中与nums[i]重复的次数,最后找time数组中最大的数以及对应的下标max_i,返回nums[max_i]。测试用例都过了,但是提交说超时!!!!

改正1:看到了个很厉害的思路,就是排序,取中间值!!我用的冒泡排序,结果还是超出时间限制。

改正2:将冒泡换成快排,还是超时。下面是快排的代码:

void QuickSort(int *a,int left,int right){

    if(left>=right){return ;}

    int begin=left,end=right;

    int pivot=begin;

    int key=a[begin];

    while(begin<end){

        while(begin<end&&a[end]>=key){end--;}

        a[pivot]=a[end];

        pivot=end;

        while(begin<end&&a[begin]<=key){begin++;}

        a[pivot]=a[begin];

        pivot=begin;

    }

    a[pivot]=key;

    QuickSort(a,left,pivot-1);

    QuickSort(a,pivot+1,right);

}

改正3:哈希表,但是HASH_FIND_INT,UT_hash_handle等学c语言的时候都没有学过....

struct hashTable{

    int key;

    int val;

    UT_hash_handle hh;

};//分号

struct hashTable *hashtable =NULL;

int ans=0;

struct hashTable* find(int ikey){

    struct hashTable *tmp=NULL;

    HASH_FIND_INT(hashtable,&ikey,tmp);

    return tmp;

}

int insert(int ikey,int ival,int numsSize){

    struct hashTable* it=find(ikey);

    if(NULL==it){

        struct hashTable* tmp=malloc(sizeof(struct hashTable));

        tmp->key=ikey;

        tmp->val=ival;

        HASH_ADD_INT(hashtable,key,tmp);

        if(tmp->val>(numsSize/2)){

            ans=tmp->key;

            return ans;

        }

    }

    else{

        it->val=it->val+1;

    }

    return -1;

}

int majorityElement(int* nums, int numsSize) {

    //改正3,哈希表

    hashtable =NULL;

    for(int i=0;i<numsSize;i++){

        struct hashTable* it=find(nums[i]);

        if(NULL==it){

            insert(nums[i],1,numsSize);

        }

        else{

            it->val+=1;

            if(it->val>(numsSize/2)){

                ans =it->key;

                break;

            }

        }

    }

    return ans;

}

改正4:哈希表,还是用java比较好。c写哈希表不会。代码如下:

class Solution {
    private Map<Integer,Integer> countNums(int[] nums){
        Map<Integer,Integer> counts=new HashMap<Integer,Integer>();
        for(int num:nums){
            if(!counts.containsKey(num)){
                counts.put(num,1);
            }
            else{
                counts.put(num,counts.get(num)+1);
            }
        }
        return counts;
    }
    public int majorityElement(int[] nums) {
        Map<Integer,Integer> counts=countNums(nums);
        Map.Entry<Integer,Integer> majorityEntry=null;
       for (Map.Entry<Integer, Integer> entry : counts.entrySet()){
           if (majorityEntry == null || entry.getValue() > majorityEntry.getValue()) {
                majorityEntry=entry;
           }
           
        }
        return majorityEntry.getKey();

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值