印度域名注册网站,室内设计师工资,中国四大互联网巨头,郑州代理记账给定一个大小为 n 的数组 nums #xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的#xff0c;并且给定的数组总是存在多数元素。 示例 1#xff1a;
输入#xff1a;nums [3,2,3]
输出#xff1a;3
示例 …给定一个大小为 n 的数组 nums 返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的并且给定的数组总是存在多数元素。 示例 1
输入nums [3,2,3]
输出3
示例 2
输入nums [2,2,1,1,1,2,2]
输出2
思路一排序后记录数的个数
c语言解法
int cmp(const void *a,const void *b){return *(int*)a-*(int*)b;
}int majorityElement(int* nums, int numsSize){qsort(nums,numsSize,sizeof(int),cmp);int n 1;for(int i 0;inumsSize-1;i){if(nums[i]nums[i1]){n;if(n*2numsSize)return nums[i];}else n1;}return nums[0];}
分析:
本题要找出数组中相同元素个数大于数组长度一半的元素可以先将原数组中数先排序一遍利用循环记录前后相等的元素当计数超过数组长度一半则返回该元素否则返回数组第一个元素
优化
因为要找到的数排序后一定为中位数直接返回中位数即可
int cmp(const void *a,const void *b){return *(int*)a-*(int*)b;
}int majorityElement(int* nums, int numsSize){qsort(nums,numsSize,sizeof(int),cmp);return nums[numsSize/2];}
进阶思路投票法
class Solution {
public:int majorityElement(vectorint nums) {int cnt 0;int candidate 0;for(const auto t:nums){if(!cnt)candidate t;cnt candidate t ? 1 : -1;}return candidate;}
};
分析
运用投票法投票法核心思路即若其他人投不同的票则直接抵消原来的一张票最后剩下的则为所找元素
总结
本题考察对数组循环计数的应用记录相同元素当记录数超过数组长度一半则返回时间复杂度为O(nlogn)若使用投票法则可使时间复杂度为O(n)