递归与递推
快速幂
问题描述:
求a的m次幂,要求时间复杂度log(n)
当然,一般不会求a的幂次,因为很容易越界,更常见的是求modN(a, m, n)
递归实现:
1
2
3
4
5
6long 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
9int 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;
}