int majorityElement(int* nums, int numsSize) {
int times=0;
//Hashtime *hash[numsSize];
int major;
//hash = (int*)calloc(1,sizeof(int));
for(int i=0;i<numsSize;i++)
{
if(times==0||major==nums[i]){
major=nums[i];
++times;
}else
--times;
}
return major;
}
上面代码是一种取巧方法,利用主元素出现次数一定大于一半这种规律
也有人利用排序算法,将排好序的数组取中间值一定是主元素,当然时间复杂度还是上面的方法好。
我本来想利用hash表记录,但是由于空间复杂度没有上面的好,该决定用上面的方法。
这里粘贴一个别人的hash表的方法。
<pre class="objc" name="code">#define MIN_VALUE 0x80000000
typedef struct _Node {
int val;
int count;
} Node;
int majorityElement(int* nums, int numsSize) {
const int length = numsSize * 2;
Node hashtable[length];
int result = 0;
for(int i = 0; i < length; ++i) {
hashtable[i].val = MIN_VALUE;
hashtable[i].count = 0;
}
for(int i = 0; i < numsSize; ++i) {
int position = *(nums + i) % length;
position += (position >= 0 ? 0 : length);
while(hashtable[position].val != MIN_VALUE) {
if(hashtable[position].val == *(nums + i)) {
hashtable[position].count++;
break;
} else {
position = (position + 13) % length;
}
}
if(hashtable[position].val == MIN_VALUE) {
hashtable[position].val = *(nums + i);
hashtable[position].count = 1;
}
}
for(int i = 0; i < length; ++i) {
if(hashtable[i].count > numsSize >> 1) {
result = hashtable[i].val;
}
}
return result;
}