题目描述:
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
例题描述:
题目解析:
这道题刚开始看的时候,考虑的是他是否会返回两个输出?但是仔细一想发现是不可能的,因为⌊ n/2 ⌋是向下取整,如果是偶数个的元素,那么这个值就是n的一半,并且这个要求是大于,那么说明一定要求元素至少比n/2大,这样的元素在偶数的时候只有一个;当n是奇数个元素的时候,他向下取整的时候,就会取(n-1)/2,假设这个数记为num,则在这个数组中大于num 的数也是有且仅有一个,所以不论是奇数还是偶数,这个输出的元素都是一个,并且题目中给出一定存在多数元素,所以不用考虑不存在的情况,根据题目写代码
代码如下:
var majorityElement = function(nums) {
var num =nums.length
var count=0
if(num == 1){
return nums[0]
}
for(var i=0;i<num;i++){
for(var j=i+1;j<num;j++){
if(nums[i] ==nums[j]){
count++
}
}
if(count+1>Math.floor(num/2)){
return nums[i]
}
count=0
}
};
代码思路:
当他只有一个元素的时候,这个元素一定是想要输出的那个元素,我们通过循环来找出多数元素,并且输出即可
存在问题:
在循环的时候,会存在重复循环,浪费了时间和空间的复杂度,所以需要改进
改进过后的代码:
var majorityElement = function(nums) {
nums.sort((a,b)=>a-b)
let l = 0,r=1
for(let i=0;i<=nums.length;i++){
if(nums[l]!==nums[r]){
if(r-l>nums.length/2){
return nums[l]
}else{
l=r
r++
}
}else{
r++
}
}
};
在时间复杂度上面改进了很多,但是空间复杂度反而提升了