【发布时间】:2017-09-23 07:16:40
【问题描述】:
给定一个数字序列:1, 11, 21, 1211, 111221, ... 序列中数字的生成规则如下: 1 是“一个 1”,所以 11。 11 是“两个 1”,所以 21。 21 是“一个 2 后跟一个 1”,所以 1211。 在这个序列中找到第 n 个数字。 假设: n从1开始,第一个数字是“1”,第二个数字是“11”
我的解决方案:
public String countAndSay(int n) {
List<Integer> result = helper(n);
StringBuilder sb = new StringBuilder();
for(Integer num : result) {
sb.append(num);
}
return sb.toString();
}
private List<Integer> helper(int n) {
List<Integer> result = new ArrayList<Integer>();
//base case
if (n == 1) {
result.add(1);
return result;
}
List<Integer> smaller = helper(n - 1);
int count = 1;
for (int i = 0; i < smaller.size(); i++) {
if (i + 1 > smaller.size() - 1 ||
!smaller.get(i + 1).equals(smaller.get(i))) {
result.add(count);
result.add(smaller.get(i));
count = 1;
} else {
count++;
}
}
return result;
}
我对大 O 符号空间复杂度的理解是,当方法运行时,最大可能的额外空间不等待垃圾收集。 所以我对这个解决方案的空间复杂度的想法是,由于递归调用是由“List small = helper(n - 1);”行完成的,因此较低级别的递归调用的额外空间已经在等待垃圾收集。所以低级别的时间复杂度不应该计入当前级别。该解决方案的空间复杂度应为 O(n)。我说的对吗?
【问题讨论】:
标签: java algorithm recursion space-complexity