文章目录
-
- [1. Fibonacci数列](#1. Fibonacci数列)
- [2. 单词搜索](#2. 单词搜索)
- [3. 杨辉三角](#3. 杨辉三角)
1. Fibonacci数列
【链接】:Fibonacci数列
解题思路:简单模拟题,要最少的步数就是找离N最近的Fibonacci数,即可能情况只有比他小的最大的那个Fibonacci数以及比他大的最小的那个Fibonacci数。两者求与其差值的绝对值最小的即可。
cpp
#include <iostream>
#include <climits>
using namespace std;
int main()
{
int n, ret = INT_MAX;
cin >> n;
int a = 0, b = 1;
while (b < n)
{
ret = min(ret, n - b);
int tmp = a + b;
a = b, b = tmp;
}
ret = min(ret, b - n);
cout << ret << endl;
return 0;
}
2. 单词搜索
【链接】:单词搜索
解题思路:一眼dfs,暴搜即可
cpp
class Solution
{
int dx[4] = { 0,0,-1,1 };
int dy[4] = { -1,1,0,0 };
int m, n;
bool visit[101][101] = { false };
public:
bool exist(vector<string>& board, string word) {
m = board.size(), n = board[0].size();
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (board[i][j] == word[0])
{
visit[i][j] = true;
if (dfs(board, i, j, word, 1)) return true;
// 回溯 -- 恢复现场
visit[i][j] = false;
}
}
}
return false;
}
bool dfs(vector<string>& board, int i, int j, string word, int pos)
{
if (pos == word.size()) return true;
for (int k = 0; k < 4; k++)
{
int x = i + dx[k], y = j + dy[k];
if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == word[pos] && !visit[x][y])
{
visit[x][y] = true;
if (dfs(board, x, y, word, pos + 1)) return true;
visit[x][y] = false; // 恢复现场
}
}
return false;
}
};
3. 杨辉三角
【链接】:杨辉三角
解题思路:最基础的 dp 模型。利用vector建二维数组,数组元素初始化为1,然后从第三行开始填数即可,只需掌握递推关系dp[i][j] = dp[i-1][j-1]+dp[i-1][j] 即可。
cpp
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<vector<int>> ret(n);
// 初始化
for (int i = 0; i < n; i++) ret[i].resize(i + 1, 1);
// 填入杨辉三角
for (int i = 2; i < n; i++)
{
for (int j = 1; j < i; j++)
{
ret[i][j] = ret[i - 1][j - 1] + ret[i - 1][j];
}
}
for (auto& vec : ret)
{
for (auto& x : vec)
{
printf("%5d", x);
}
cout << endl;
}
return 0;
}