実際に資格を与えLeetCode - 再帰的なパーティション&

再帰

:この例の列フィボナッチ証書の数
だけこの問題の層の各層に対応し、その結果を次の層の階乗(N-1)と仮定されます

int factorial(int n){
	if(n <= 1) return 1;//第一步,确定终止条件
	int m = factorial(n-1);//第二步,递归并得到返回结果
	return n * m;//第三步,返回结果
}

パーティション(分割統治)

すばらしいです \色{#FF3030} {いくつかのサブ問題に大きな問題デ合併後解決するには、サブ問題}

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
公開された24元の記事 ウォン称賛12 ビュー10000 +

おすすめ

転載: blog.csdn.net/Protocols7/article/details/103934653