Crystal通过本文主要向大家介绍了c语言实现分而治之算法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
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.
解题思路:
这是关于分而治之算法的题目。运用递归的思想,将原来的数组减半分成两个数组,再计算出这两个数组的majority element。如果这两个数组的majority element相等的话,就说明这是原来数组的majority element,否则就比较这两个elements在原来数组中出现的次数,次数多的element才是原来数组真正的majority element。
一开始判断elements出现次数的时候,选择for循环遍历的粗暴方法:
for (int i = begin; i <= end; i++) {
if (nums[i] == left_element)
num1++;
else if (nums[i] == right_element)
num2++;
}
但是很明显,RunTime Error!!!之后发现STL算法中的count函数可以实现for循环的功能并且降低时间复杂度,试了一下就真的Accepted!!!
代码实现:
#include <vector.h>
#include <algorithm.h>
class Solution {
public:
int majorityElement(vector<int>& nums) {
int begin = 0;
int end = nums.size()-1; //注意“-1”
return majority(nums, begin, end);
}
private:
int majority(vector<int>& nums, int begin, int end) {
//nums只有1个元素
if (begin == end)
return nums[begin];
else {
int middle = (end - begin)/2 + begin; //注意begin,middle,end的大小关系
int left_element = majority(nums, begin, middle);
int right_element = majority(nums, middle+1, end);
if (left_element == right_element)
return left_element;
else {
int num1 = 0, num2 = 0;
num1 = count(nums.begin()+begin, nums.begin()+end+1, left_element);
num2 = count(nums.begin()+begin, nums.begin()+end+1, right_element);
if (num1 >= num2) return left_element;
else return right_element;
}
}
}
};