递归与递推
快速幂
问题描述:
求a的m次幂,要求时间复杂度log(n)
当然,一般不会求a的幂次,因为很容易越界,更常见的是求modN(a, m, n)
- 递归实现: - 1 
 2
 3
 4
 5
 6- long long pow1(a, m) { 
 if (m == 0)
 return 1;
 if (m & 1) a*pow1(a, m-1);
 else a*a*pow1(a, m/2);
 }
- 递推实现 - 1 
 2
 3
 4
 5
 6
 7
 8
 9- int ans = 1; 
 while(m) {
 if (m&1) {
 ans *= a;
 --m;
 }
 a = a*a;
 m /= 2;
 }
算法思维扩展:(往届一道考题)
寻找多位元素
问题描述:
输入数组A,找出A[1, … , n]中的多位元素(多位元素:数量大于一半)
- 代码实现 
 核心思想:如何找出多位元素的候选值 O(n), 之后再判断候选值是否为多位元素
 一个序列,同时删去两个不同的数,该数组的多位元素不变- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17- // 伪代码,只是阐述算法思想 
 int condidate(int c) {
 int count = 1, i;
 for (i=c+1; i<n && count; ++i)
 count += (A[i] == A[c] ? 1:-1);
 if (count == 0) condidate(i);
 return A[c];
 }
 int findDuo() {
 int c = condidate(0);
 int count = 0;
 for (int i=0; i<n; ++i)
 if (A[i] == c) count++;
 if (count > n/2) return c;
 else none;
 }