42.leetcode题目:169. Majority Element(还有一种方法待做)

题目:

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

分析:

这题在剑指offer上看到过,剑指offer上还没有说明这个数字一定存在,所以在寻找结束后,还要判断这个数字是否超过了总长度的一半

根据快速排序来做,出现次数超过一半的数字必定位于正中间。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int n=nums.size();
        int start=0,end=n-1,middle=(n)/2;
        int index=Partition(nums,n,start,end);
        while(index!=middle){
        if(index<middle){
            start=index+1;
            index=Partition(nums,n,start,end);
        }
        else{
            end=index-1;
            index=Partition(nums,n,start,end);
        }
        }
        return nums[index];
    }
    int Partition(vector<int>&data,int length,int start,int end){
        //if(data.empty()||length<=0||start<0||end>=length)
        //return -1;
        //int middle=(start+end)/2;
        int index=start-1;
        //swap(data[middle],data[end]);
        for(int i=start;i<end;++i){
            if(data[i]<data[end]){
            ++index;
            if(index!=i)
            swap(data[index],data[i]);
            }
        }
        ++index;
        swap(data[end],data[index]);
        return index;
    }
};

40ms。

看到讨论里别人做的,有很巧妙的,:每找到两个不一样的数字则成对删除,最后剩下的数字就是要找的数字。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值