标签:
这道题直观的思路是对数组直接排序,排序后中间位置的元素就是要求的元素,时间复杂度是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; } };
标签:
原文地址:http://www.cnblogs.com/summerkiki/p/5479770.html