题目:
给定一个大小为 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();
}
}