返回
算法刷题日记:斐波拉契数的最小步数与合法括号序列的判断
后端
2023-09-25 21:16:59
斐波拉契数最小步数
斐波拉契数列是由0和1开始,之后的每个数都为前两个数之和。斐波拉契数列前几项为:0、1、1、2、3、5、8、13、21、34、……
给定一个正整数n,您需要找到将n分解为斐波拉契数之和的最小步数。
例如,如果n=10,则有以下几种分解方式:
- 10 = 8 + 2
- 10 = 5 + 5
- 10 = 3 + 3 + 4
其中,最少分解步数为2(8+2),因此答案为2。
合法括号序列判断
给定一个只包含'('和')'的字符串,您需要判断该字符串是否是合法的括号序列。
合法的括号序列是指,每个左括号'('都必须有对应的右括号')'与之匹配,并且括号不能交叉或重叠。
例如,以下字符串是合法的括号序列:
- "()"
- "()()"
- "((()))"
以下字符串不是合法的括号序列:
- "(())"
- "(()"
- "))"
Java代码实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 获取输入
int n = scanner.nextInt();
String str = scanner.next();
// 判断斐波拉契数最小步数
int minSteps = fibonacciMinSteps(n);
System.out.println(minSteps);
// 判断合法括号序列
boolean isValid = isValidParentheses(str);
System.out.println(isValid);
}
/**
* 计算斐波拉契数最小步数
*
* @param n 正整数
* @return 最小步数
*/
public static int fibonacciMinSteps(int n) {
if (n == 0 || n == 1) {
return 0;
}
// 初始化斐波拉契数列
int[] fib = new int[n + 1];
fib[0] = 0;
fib[1] = 1;
// 计算斐波拉契数列
for (int i = 2; i <= n; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
}
// 计算最小步数
int minSteps = Integer.MAX_VALUE;
for (int i = 1; i <= n; i++) {
if (fib[i] <= n) {
int steps = fibonacciMinSteps(n - fib[i]) + 1;
if (steps < minSteps) {
minSteps = steps;
}
}
}
return minSteps;
}
/**
* 判断合法括号序列
*
* @param str 字符串
* @return 是否合法
*/
public static boolean isValidParentheses(String str) {
if (str == null || str.length() == 0) {
return true;
}
// 使用栈来存储左括号
Stack<Character> stack = new Stack<>();
// 遍历字符串
for (char c : str.toCharArray()) {
if (c == '(') {
stack.push(c);
} else if (c == ')') {
if (stack.isEmpty()) {
return false;
}
stack.pop();
}
}
// 如果栈不为空,则字符串不是合法的括号序列
return stack.isEmpty();
}
}
希望这篇文章对您有所帮助!