leecode第一百六十九题(求众数)
class Solution { public: void quick_sort(vector<int>& nums,int res,int res_end) { if(res_end-res<1)//错过,不能小于2 return; int begin=res; int end=res_end; bool flag=true; while(res!=res_end) { if(flag) { if(nums[res]>nums[res_end]) { int temp=nums[res]; nums[res]=nums[res_end]; nums[res_end]=temp; res++; flag=!flag; } else res_end--; } else { if(nums[res]>nums[res_end])//错过,不小心写成小于了 { int temp=nums[res]; nums[res]=nums[res_end]; nums[res_end]=temp; res_end--; flag=!flag; } else res++; } } quick_sort(nums,begin,res); quick_sort(nums,res+1,end); } int majorityElement(vector<int>& nums) { int len=nums.size(); //int res; //sort(nums.begin(),nums.end());//解法一:现成API //quick_sort(nums,0,len-1);//解法二:手写了快排,但是最长的那个时间通不过,这是因为sort()函数里面不是单纯的快排,里面还有堆排序和插入排序等情况 //return nums[len/2]; int count = 1;//解法三,网友提供,从第一个数开始count=1,遇到相同的就加1,遇到不同的就减1,减到0就重新换个数开始计数,总能找到最多的那个 int maj = nums[0]; for (int i = 1; i < len; i++) { if (maj == nums[i]) count++; else { count--; if (count == 0) { maj = nums[i + 1]; } } } return maj; //解法4:哈希表 } };
分析:
题简单但是思想不简单啊,尤其是网友公认的这个,值的学习。