LEETCODE 169

来源:互联网 发布:最新推广软件 编辑:程序博客网 时间:2024/04/30 20:09

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.


这道题和以前看到的一个求谁发的帖子有点像。

思路:

如果有一个元素A超过了一半,那么任何情况下,去除两个不同的数字以后,A仍然超过一半。设总数为sum, A的数值为a;那么有a/sum >1/2,,即2a>sum;

第一种情况:去除的两个不包括A元素,则有总数变为sum-2,A元素个数不变,那么就有a/(sum-2)?1/2,很明显,即判断2a和sum-2的值,有2a>sum-2;

第二种情况:去除的两个有一个A元素,则有总数变为sum-2,A元素个数变为a-1,那么就有(a-1)/(sum-2)?1/2,即判断2(a-1)和sum-2的大小,即2a和sum的关系。


程序设计:

刚开始我是利用双指针,一个从前遍历,一个从后遍历,那么最差的情况即遍历N/2次就会找到,但是忽略了以下排列情况:

9 9 10 10 10 9 9 

后来改变了思路,如果当前两个相等,则判断前遍历当前点和当前点后一个是否相等,如果不等,就去除当前点和当前点后一点。具体的数学证明还没有想通;

class Solution {public:    int majorityElement(vector<int>& nums) {   while(nums.size() > 1){bool flag = false;for (int i = 0; i < nums.size()/2; ++i){if (nums[i] != nums[nums.size() - 1 - i]){nums.erase(nums.begin()+ nums.size() - 1 - i);nums.erase(nums.begin() + i);flag = true;break;}if (nums[i] != nums[i+1]){nums.erase(nums.begin() + i + 1);nums.erase(nums.begin() + i );flag = true;break;}}if (flag == false)return nums[0];}return nums[0];    }};


0 0
原创粉丝点击