-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathRaiseToPower.java
65 lines (56 loc) · 1.67 KB
/
RaiseToPower.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package by.andd3dfx.numeric;
import java.util.NavigableSet;
import java.util.TreeMap;
/**
* <pre>
* <a href="https://leetcode.com/problems/powx-n/">Task description</a>
*
* Raise number a to power p
*
* Based on "Stephens - Essential Algorithms"
* </pre>
*
* @see <a href="https://youtu.be/peiEt6TkpLU">Video solution</a>
*/
public class RaiseToPower {
public static float apply(float a, int p) {
boolean reversePowerFlag = (p < 0);
if (reversePowerFlag) {
p = -p;
}
float result = 1;
for (int i = 0; i < p; i++) {
result *= a;
}
if (reversePowerFlag) {
return 1 / result;
}
return result;
}
public static float applyEnhanced(float a, int p) {
boolean reversePowerFlag = (p < 0);
if (reversePowerFlag) {
p = -p;
}
// Calculate a, a^2, a^4 , a^8 etc, until we get a^N, where N + 1 > p
TreeMap<Integer, Float> map = new TreeMap<>();
map.put(1, a);
for (int power = 1; 2 * power < p; power *= 2) {
map.put(2 * power, map.get(power) * map.get(power));
}
// Use {a, a^2, ...} to calculate a^P
NavigableSet<Integer> descendingKeySet = map.descendingKeySet();
float result = 1;
for (Integer power : descendingKeySet) {
while (p >= power) {
result *= map.get(power);
p -= power;
// System.out.println(power);
}
}
if (reversePowerFlag) {
return 1 / result;
}
return result;
}
}