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:哈希表
    }
};

分析:

题简单但是思想不简单啊,尤其是网友公认的这个,值的学习。

原文地址:https://www.cnblogs.com/CJT-blog/p/10718587.html