Majority Element
2016-05-11 09:22
302 查看
这道题直观的思路是对数组直接排序,排序后中间位置的元素就是要求的元素,时间复杂度是O(nlogn)。
但是还有更快的解法,基于快速排序中partition函数的O(n)算法。快速排序的partition函数有两种解法,一种是“两个下标分别从首尾向中间扫描”,另一种是“两个指针索引一前一后逐步向后扫描”。在leetcode中,只有后一种方法可以满足时时间复杂度的要求,这两种方法在时间复杂度上的区别,我还没有完全想清楚。
class Solution { public: int partition(vector<int>& nums,int begin,int end) { int i=begin-1; for(int j=begin;j<end;j++) { if(nums[j]<nums[end]) { i++; int temp=nums[j]; nums[j]=nums[i]; nums[i]=temp; } } i++; int temp=nums[end]; nums[end]=nums[i]; nums[i]=temp; return i; } int majorityElement(vector<int>& nums) { int begin=0; int end=nums.size()-1; int index=partition(nums,begin,end); int mid=(nums.size()-1)/2; while(index!=mid) { if(index<mid) { begin=index+1; index=partition(nums,begin,end); } else if(index>mid) { end=index-1; index=partition(nums,begin,end); } } return nums[index]; } };
//快速排序partition的另一种解法 int partition(vector<int>& nums,int begin,int end) { int pivot=nums[begin]; while(begin<end) { while(begin<end&&pivot<=nums[end]) end--; nums[begin]=nums[end]; while(begin<end&&pivot>=nums[begin]) begin++; nums[end]=nums[begin]; } nums[begin]=pivot; return begin; }
还有一种更简单的O(n)方法,通过在遍历数组时,计算数字出现的次数来获得最后的result。
class Solution { public: int majorityElement(vector<int>& nums) { int result=nums[0]; int time=1; for(int i=1;i<nums.size();i++) { if(time==0) { result=nums[i]; time=1; } else if(result==nums[i]) time++; else time--; } return result; } };
相关文章推荐
- spring 下载地址
- Flex3与java BlazeDS入门教程及其配置详解
- Mozilla新特性只支持https网站,再次推动SSL证书普及
- MSBuild编译vs工程的常用指令
- Matlab 读写入txt文件
- 红黑树详讲--有图有思路
- 电脑显卡4种接口类型:VGA、DVI、HDMI、DP
- Android——自定义滚动ViewGroup
- iOS开发之基础视图——UITextView
- ViewPager 详解(一)---基本入门
- (转) 用API接口签名验证参考
- XML 总结
- 第3章 创建型模式—单例模式
- 充分统计量
- Cocoa Touch事件处理流程
- XMG Quartz2D 图片截取操作
- Linux makefile 教程 非常详细,且易懂
- Mozilla新特性只支持https网站,再次推动SSL证书普及
- Appium的DesiredCapabilities参数设置
- ROS_Kinetic_02 ROS Kinetic 迁移指南及中文wiki指南(Migration guide)