所在的位置: C++ >> C++发展 >> LeetCode169多数元素c

LeetCode169多数元素c

目录

1、题目2、思路1、c++代码14、java代码15、思路26、c++代码27、Java代码2

1、题目

给定一个大小为n的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于n/2的元素。

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

示例1:

输入:[,2,]输出:

示例2:

输入:[2,2,1,1,1,2,2]输出:2

进阶:

尝试设计时间复杂度为O(n)O(n)O(n)、空间复杂度为O(1)O(1)O(1)的算法解决此问题。

2、思路1

(哈希表)O(n)O(n)O(n)

1、使用用哈希表记录每个元素出现多少次。

2、判断每个元素出现的次数是否大于n/2n/2n/2,如果大于,则返回该数字即可。

时间复杂度分析:O(n)O(n)O(n)

空间复杂度分析:至少需要额外的O(n)O(n)O(n)空间。

、c++代码1

classSolution{public:intmajorityElement(vectorintnums){unorded_mapint,inthash;for(inti=0;inums.size();i++){hash[nums[i]]+=1;if(hash[nums[i]]nums.size()/2)turnnums[i];}turn0;}};

4、java代码1

classSolution{publicintmajorityElement(int[]nums){HashMapInteger,Integermap=newHashMapInteger,Integer();intn=nums.length;for(inti=0;in;i++){intx=nums[i];map.put(x,map.getOrDefault(x,0)+1);}ints=0;intcount=0;for(Map.EntryInteger,Integerentry:map.entrySet()){if(entry.getValue()count){count=entry.getValue();s=entry.getKey();}}turns;}}

5、思路2

(投票算法)O(n)O(n)O(n)

当一个国家的总统候选人r的支持率大于50%的话,即使每个反对他的人都给他投一个反对票,抵消掉他的支持票,他的支持票也不会被完全消耗掉。因此,我们可以假定和r相同的数都是支持票,和r不同的数都是反对票。

维护两个变量:候选人和他的票数

1、候选人初始化为r=0,票数c初始化为0,遍历整个数组2、当候选人的票数为0时,更换候选人,并将票数重置为1、当候选人的值和当前元素相同时,票数加1,否则减14、最后维护的候选人即是答案

时间复杂度分析:O(n)O(n)O(n),nnn是数组的大小。

空间复杂度分析:仅使用了两个变量,故需要O(1)O(1)O(1)的额外空间。

6、c++代码2

classSolution{public:intmajorityElement(vectorintnums){intr,c=0;for(autox:nums)if(!c)r=x,c=1;//重置候选人elseif(r==x)c++;//票数加一elsec--;//票数减一turnr;}};

7、Java代码2

classSolution{publicintmajorityElement(int[]nums){intr=0,c=0;for(inti=0;inums.length;i++){intx=nums[i];if(c==0){r=x;c=1;}//重置候选人elseif(r==x)c++;//票数加一elsec--;//票数减一}turnr;}}

原题链接:.多数元素

,


转载请注明:http://www.aierlanlan.com/tzrz/3460.html