Mutating counts without cleanup
Wrong move: Zero-count keys stay in map and break distinct/count constraints.
Usually fails on: Window/map size checks are consistently off by one.
Fix: Delete keys when count reaches zero.
Move from brute-force thinking to an efficient approach using hash map strategy.
Given three integers x, y, and bound, return a list of all the powerful integers that have a value less than or equal to bound.
An integer is powerful if it can be represented as xi + yj for some integers i >= 0 and j >= 0.
You may return the answer in any order. In your answer, each value should occur at most once.
Example 1:
Input: x = 2, y = 3, bound = 10 Output: [2,3,4,5,7,9,10] Explanation: 2 = 20 + 30 3 = 21 + 30 4 = 20 + 31 5 = 21 + 31 7 = 22 + 31 9 = 23 + 30 10 = 20 + 32
Example 2:
Input: x = 3, y = 5, bound = 15 Output: [2,4,6,8,10,14]
Constraints:
1 <= x, y <= 1000 <= bound <= 106Problem summary: Given three integers x, y, and bound, return a list of all the powerful integers that have a value less than or equal to bound. An integer is powerful if it can be represented as xi + yj for some integers i >= 0 and j >= 0. You may return the answer in any order. In your answer, each value should occur at most once.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Hash Map · Math
2 3 10
3 5 15
count-the-number-of-powerful-integers)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #970: Powerful Integers
class Solution {
public List<Integer> powerfulIntegers(int x, int y, int bound) {
Set<Integer> ans = new HashSet<>();
for (int a = 1; a <= bound; a *= x) {
for (int b = 1; a + b <= bound; b *= y) {
ans.add(a + b);
if (y == 1) {
break;
}
}
if (x == 1) {
break;
}
}
return new ArrayList<>(ans);
}
}
// Accepted solution for LeetCode #970: Powerful Integers
func powerfulIntegers(x int, y int, bound int) (ans []int) {
s := map[int]struct{}{}
for a := 1; a <= bound; a *= x {
for b := 1; a+b <= bound; b *= y {
s[a+b] = struct{}{}
if y == 1 {
break
}
}
if x == 1 {
break
}
}
for x := range s {
ans = append(ans, x)
}
return ans
}
# Accepted solution for LeetCode #970: Powerful Integers
class Solution:
def powerfulIntegers(self, x: int, y: int, bound: int) -> List[int]:
ans = set()
a = 1
while a <= bound:
b = 1
while a + b <= bound:
ans.add(a + b)
b *= y
if y == 1:
break
if x == 1:
break
a *= x
return list(ans)
// Accepted solution for LeetCode #970: Powerful Integers
struct Solution;
impl Solution {
fn powerful_integers(x: i32, y: i32, bound: i32) -> Vec<i32> {
let mut set: Vec<bool> = vec![false; bound as usize + 1];
let mut i = 0;
while x.pow(i) < bound {
let mut j = 0;
while y.pow(j) < bound {
let sum = x.pow(i) + y.pow(j);
if sum <= bound {
set[sum as usize] = true;
}
j += 1;
if y == 1 {
break;
}
}
i += 1;
if x == 1 {
break;
}
}
let mut res = vec![];
for i in 0..=bound {
if set[i as usize] {
res.push(i);
}
}
res
}
}
#[test]
fn test() {
let x = 2;
let y = 3;
let bound = 10;
let res = vec![2, 3, 4, 5, 7, 9, 10];
assert_eq!(Solution::powerful_integers(x, y, bound), res);
}
// Accepted solution for LeetCode #970: Powerful Integers
function powerfulIntegers(x: number, y: number, bound: number): number[] {
const ans = new Set<number>();
for (let a = 1; a <= bound; a *= x) {
for (let b = 1; a + b <= bound; b *= y) {
ans.add(a + b);
if (y === 1) {
break;
}
}
if (x === 1) {
break;
}
}
return Array.from(ans);
}
Use this to step through a reusable interview workflow for this problem.
For each element, scan the rest of the array looking for a match. Two nested loops give n × (n−1)/2 comparisons = O(n²). No extra space since we only use loop indices.
One pass through the input, performing O(1) hash map lookups and insertions at each step. The hash map may store up to n entries in the worst case. This is the classic space-for-time tradeoff: O(n) extra memory eliminates an inner loop.
Review these before coding to avoid predictable interview regressions.
Wrong move: Zero-count keys stay in map and break distinct/count constraints.
Usually fails on: Window/map size checks are consistently off by one.
Fix: Delete keys when count reaches zero.
Wrong move: Temporary multiplications exceed integer bounds.
Usually fails on: Large inputs wrap around unexpectedly.
Fix: Use wider types, modular arithmetic, or rearranged operations.