leetcode刷题之旅——169. Majority Element
来源:互联网 发布:linux 强行退出vim 编辑:程序博客网 时间:2024/05/29 07:55
本周学习了分治法,所以准备在leetcode中挑选几道分治算法的题目来写。然而分治算法题目当中只有一道是easy,其他都是middle或者hard的题目,让我很慌。所以先把这唯一一道easy的题目写出来,给自己长点自信。
这道题目的意思就是从一个数组当中找到出现次数大于n/2的那个数,即题目当中给我们的主元素。
先说一下对于这道题目,我的分治算法是怎样的。首先,我们把这一个数组分为两个数组,S1和S2。这样,我们就把这个问题分解成了更小规模的相同问题,即在S1和S2中分别找到主元素。那么就会出现两种情况,当S1和S2中的主元素相同的情况下,毫无疑问,总的数组当中的主元素就是这个数。但是另一种情况就是,这两个主元素并不相同,那我们应该怎么办呢?我想不到更好的方法,只能重新搜索一下整个数组,看到底哪个是真正的主元素。
这道题的做法有很多种,如果采用分治法来做这道题目的话,复杂度是O(nlogn)。根据上周课上的内容来看,T(n)=2T(n/2)+2O(n)是这道题的推导公式,而Master theorem告诉我们这道题的复杂度就是O(nlogn)。当然我最开始想到的并不是分治法,我想的是将数组排序,记录出现次数最多的那个就一定是主元素,这种做法很容易实现,就不再赘述了。
下面贴出来我写的源代码:
class Solution {public: int majorityElement(vector<int>& nums) { return dc(nums,0,nums.size()-1); } int dc(vector<int>& nums,int begin,int end) { if(begin==end) return nums[begin]; int left,right; if(begin<end) { int mid=(begin+end)/2; left=dc(nums,begin,mid); right=dc(nums,mid+1,end); if(left==right) return right; else { int lcount=0; int rcount=0; for(int i=begin;i<=end;i++) { if(nums[i]==left) lcount++; else if(nums[i]==right) rcount++; } if(lcount>rcount) return left; else return right; } } return right; }};
0 0
- leetcode刷题之旅——169. Majority Element
- LeetCode—Majority Element
- leetcode之169. Majority Element
- leetcode刷题日记——Majority Element
- LeetCode OJ刷题历程——Majority Element
- LeetCode——Majority Element
- leetcode——Majority Element
- LeetCode——Majority Element
- leetcode之majority element
- LeetCode之Majority Element
- leetcode之Majority Element
- leetcode之Majority Element
- LeetCode之Majority Element
- LeetCode之路:169. Majority Element
- [LeetCode]169.Majority Element
- LeetCode 169.Majority Element
- 【LeetCode】169.Majority Element
- LeetCode 169. Majority Element
- 《算法竞赛入门经典训练指南》第一章1.1,1.2
- STM32F407的RAM调试
- Android.mk编译控制
- 想在空闲时间做的事情
- Hibernate的悲观锁和乐观锁
- leetcode刷题之旅——169. Majority Element
- 冒泡排序的Java实现
- 使用Fiddler进行弱网模拟
- 微型电脑-树莓派
- (转)C语言预处理命令大全
- 关于TI cc2640
- BFS-小学期考核
- 《机器学习实战》学习(三)——决策树实例
- hdu 5869 Different GCD Subarray Query 预处理 + 离线