求數組中出現次數查過n/2的元素

前提:此數組不爲空,且這樣的元素存在


solutions:

分析:可以將數組排序,出現在n/2+1位置的一定是所求。故排序的話也可以只排前n/2+1個。

class Solution {
public:
	void quikSort(vector<int>& nums, int low1, int high1) {
		//int low=0, high=nums.size();
		int low=low1, high=high1;
		if(low >= high){
			return;
		}
		int key=nums[low];
		while(low < high) {
			while(low<high && nums[high]>=key) {
				--high;
			}
			nums[low]=nums[high];
			while(low<high && nums[low]<=key) {
				++low;
			}
			nums[high]=nums[low];
		}
		nums[low]=key;
		quikSort(nums, low1, low-1);
		quikSort(nums, low+1, high1);
	}
	void sort(vector<int>& nums) {
		quikSort(nums, 0, nums.size()-1);
	}
	int majorityElement(vector<int>& nums) {
		vector<int> V(&nums[0], &nums[nums.size()/2+1]);
		sort(V);
		return V.back();
	}
};

但是在lc上運行超時。

其實存在一個O(n)的算法:

用兩個變量,一個計數器count,一個記錄出現次數最多的元素result。

從第2個元素開始遍歷,和其前一個相等則讓count+1,不等則-1,減爲0則讓result變爲當前元素。

result的最終值及爲所求。

class Solution {
public:
	int majorityElement(vector<int> &nums) {
		int result=nums[0];
		int count=1;
		for(int i=1; i<nums.size(); ++i) {
			if(nums[i] == result) {
				++count;
			} 
			else {
				--count;
				if(count == 0) {
					result=nums[i];
					++count;
				}
			}
		}
		return result;
	}
};


還有大俠想出來了隨機數的算法:http://www.cnblogs.com/fanyabo/p/4178993.html

class Solution {
public:
    int majorityElement(vector<int> &num) {
		
        int count = 0;
        
        for(;;) {
            if(num.size() == 1)
                return num[0];
            else    {
                int i = rand() % (num.size() - 1);
                for(int j = 0; j < num.size(); j++) {
                    if(num[j] == num[i])
                        count++;
                }
                if(count > (num.size() / 2))
                    return num[i];
                else    {
                    count = 0;
                    continue;
                }
            }
        }
    }
};



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章