再帰
:この例の列フィボナッチ証書の数
だけこの問題の層の各層に対応し、その結果を次の層の階乗(N-1)と仮定されます
int factorial(int n){
if(n <= 1) return 1;//第一步,确定终止条件
int m = factorial(n-1);//第二步,递归并得到返回结果
return n * m;//第三步,返回结果
}
パーティション(分割統治)
POW(X、N)
パワーN(XN)に上昇さxを算出POW(X、n)を、実装します。
例1:
入力:2.00000、10出力:1024.00000
例2:
入力:2.10000、3出力:9.26100
暴力O(N)、分割統治:
N / 2の分解は/各サブ問題の数およびn分解である2を乗じた数を乗じています。
double myPow(double x,int n){
if(n == 0) return 1;
if(n < 0) return 1/myPow(x,-n);
if(n == 1) return x;
int half = n / 2;
return myPow(x,half)*myPow(x,n-half);
}
モードを探します
サイズnの配列を指定して、大多数の要素を見つけます。大多数の
要素は、より多くのN / 2⌋回⌊よりも現れる要素です。あなたは、配列が空であると仮定してもよいし、多数の要素が
常に配列に存在します。例1:
入力:[3,2,3]出力:3
この質問にソリューションの6種類を参照してください(壁の上にあることを)
- アレイを通して暴力、Oの各要素の統計情報の数(N2)
- セット、セットに配列要素は、本方法は、O(N)、またはマップによって最大数を返します
int majorityElement1(vector<int>& nums) {//哈希 O(n) 32ms 空间O(n)
unordered_map<int,int> hash;
for(int i=0;i<nums.size();i++){
if (++hash[nums[i]]>nums.size()/2)
return nums[i];
}
}
- アレイをソートする、中央数は、モードO(NlogN)であります
int majorityElement2(vector<int>& nums) {
nth_element(nums.begin(), nums.begin() + nums.size() / 2, nums.end());
return nums[nums.size() / 2];
}
- 随机法:ランダム要素を選ぶと、それは大多数の1であるかどうかを確認します。
int majorityElement3(vector<int>& nums) {
int n = nums.size();
srand(unsigned(time(NULL)));
while (true) {
int idx = rand() % n;
int candidate = nums[idx];
int counts = 0;
for (int i = 0; i < n; i++)
if (nums[i] == candidate)
counts++;
if (counts > n / 2) return candidate;
}
}
- 分割統治、左右の半分の配列は、会衆の数を見つけるために関数を呼び出しています。O(NlogN)
int majorityElement(vector<int>& nums) { //3 分治:left<right 返回right =则随便返回
return majority(nums, 0, nums.size() - 1);
}
int majority(vector<int>& nums, int left, int right) {
if (left == right) return nums[left];//二分到头了 返回该值
int mid = left + ((right - left) >> 1);
int lm = majority(nums, left, mid);//二分查找左半部分 lm是左半部分的结果/数值
int rm = majority(nums, mid + 1, right);
if (lm == rm) return lm;//左半部分数值等于右半部分数值 那么这个就是我们需要的
return count(nums.begin() + left, nums.begin() + right + 1, lm) > count(nums.begin() + left, nums.begin() + right + 1, rm) ? lm : rm;
// 左半部分某个数出现的多,那么就返回这个数
}
- モル投票方法:123341111例。ポインタスタート、ポイント1、異なる2出会い、彼らがオフセット。ポインタと点3 3遭遇は、カウンタが1,4及び1回の遭遇だけインクリメントされ、それがオフセットされています。出会い1から1のポインタ、キャンセルされていません。トラバーサルが完了すると、残りの1がモードです。原理は、モードが1である場合、他の数が-1であり、0よりも大きくなければなりません。
class Solution {
public:
int majorityElement(vector<int>& nums) {
int target = nums[0];
int count = 1;
for(int i = 1;i<nums.size();i++)
if(nums[i]!=target)
{
count--;
if(count==0)//count为0 则选择下一个元素为target
{
target = nums[i];
count = 1;
}
}else count++;
return target;
}
};
作者:heroine-yun
链接:https://leetcode-cn.com/problems/majority-element/solution/tong-gui-yu-jin-by-vailing/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。