中心对称数 III
难度:
标签:
题目描述
代码结果
运行时间: 34 ms, 内存: 16.3 MB
/*
* 思路:
* 1. 使用 Java Stream API 和一个 HashMap 来实现。
* 2. Stream 中的 forEach 代替传统的 for 循环。
* 3. 使用一个原子引用来存储结果。
*/
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.IntStream;
public class TwoSumStream {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<>();
AtomicReference<int[]> result = new AtomicReference<>(new int[0]);
IntStream.range(0, nums.length).forEach(i -> {
int complement = target - nums[i];
if (map.containsKey(complement)) {
result.set(new int[] { map.get(complement), i });
}
map.put(nums[i], i);
});
return result.get();
}
}
解释
方法:
本题使用DFS+记忆化搜索的方法来统计在给定范围内的中心对称数的个数。主要思路是:从高位到低位依次构造中心对称数,在构造的过程中,根据已经构造的前缀判断剩余部分是否能够构成中心对称数,如果可以直接计算出个数,避免重复搜索。同时使用记忆化存储已经搜索过的状态,降低时间复杂度。
时间复杂度:
O(n * 5^(n/2))
空间复杂度:
O(n * 5^(n/2))
代码细节讲解
🦆
为什么在DFS的设计中,使用了`digits = [0,1,6,8,9]`而没有包括其他数字如2,3,4等?
▷🦆
在函数`flip`中,如果传入的数字字符串中有不是`0,1,6,8,9`的字符,函数会如何处理?是否有错误处理机制?
▷🦆
在递归函数`dfs`中,`limit`参数的具体作用是什么?如何通过这个参数控制搜索范围?
▷🦆
在记忆化搜索时,为什么选择对`dfs`函数使用`@cache`装饰器,而不是手动管理一个记忆化数组?
▷