1、微信红包(多种方法)
//1、哈希映射
int getValue(vector<int> gifts, int n)
{
map<int, int> val_count_map;
for (const auto &e : gifts)
{
val_count_map[e]++;
}
for (const auto &e : val_count_map)
{
if (e.second>n / 2)
return e.first;
}
return 0;
}
//2、排序、取中间值
int getValue(vector<int> gifts, int n) {
sort(gifts.begin(), gifts.end());
int mid_val = gifts[n / 2];
int count = 0;
for (const auto &e : gifts)
{
if (mid_val == e)
count++;
}
if (count > n / 2)
return mid_val;
return 0;
}
//3、dp
int getValue(vector<int> gifts, int n) {
int flag = 1;
int res = gifts[0];
int count = 0;
if (n == 1)
return res;
for (int i = 1; i < n; i++) {
if (flag == 0) {
res = gifts[i];
flag = 1;
continue;
}
if (res == gifts[i])
++flag;
else
--flag;
}
for (int i = 0; i < n; ++i) {
if (res == gifts[i])
++count;
}
if (count > n / 2)
return res;
else
return 0;
}
2、计算字符串的距离
int GetMinDistance(string s1, string s2) {
if (s1.empty() || s2.empty())
return max(s1.size(), s2.size());
int len1 = s1.size();
int len2 = s2.size();
vector<vector<int>> f(len1 + 1, vector<int>(len2 + 1, 0));
for (int i = 0; i <= len1; ++i)
f[i][0] = i;
for (int j = 0; j <= len2; ++j)
f[0][j] = j;
for (int i = 1; i <= len1; ++i) {
for (int j = 1; j <= len2; ++j) {
if (s1[i - 1] == s2[j - 1]) {
f[i][j] = min(f[i - 1][j], f[i][j - 1]) + 1;
f[i][j] = min(f[i - 1][j - 1], f[i][j]);
}
else {
f[i][j] = min(f[i - 1][j], f[i][j - 1]) + 1;
f[i][j] = min(f[i - 1][j - 1] + 1, f[i][j]);
}
}
}
return f[len1][len2];
}
3、年终奖(dp)
int getMost(vector<vector<int> > board) {
int row = board.size();
int col = board[0].size();
vector<vector<int>> allPrice(row + 1, vector<int>(col + 1, 0));
for (int i = 1; i <= row; ++i)
{
for (int j = 1; j <= col; ++j)
{
allPrice[i][j] = max(allPrice[i - 1][j], allPrice[i][j - 1]) + board[i - 1][j - 1];
}
}
return allPrice[row][col];
}
4、迷宫问题
int row, col;
vector<vector<int>> maze;
vector<vector<int>> path_tmp;
vector<vector<int>> path_best;
void mazeTrack(int i, int j) {
maze[i][j] = 1; //代表点(i,j)已经走过
path_tmp.push_back({ i, j });
//判断是否到达出口
if (i == row - 1 && j == col - 1) {
//寻找最短路径
if (path_best.empty() || path_best.size() > path_tmp.size())
path_best = path_tmp;
}
//向右走
if (j + 1 < col && maze[i][j + 1] == 0)
mazeTrack(i, j + 1);
//向左走
if (j - 1 >= 0 && maze[i][j - 1] == 0)
mazeTrack(i, j - 1);
//向上走
if (i - 1 >= 0 && maze[i - 1][j] == 0)
mazeTrack(i - 1, j);
//向下走
if (i + 1 < row && maze[i + 1][j] == 0)
mazeTrack(i + 1, j);
maze[i][j] = 0; //回溯;恢复路径
path_tmp.pop_back();
}
int main() {
while (cin >> row >> col) {
maze = vector<vector<int>>(row, vector<int>(col, 0));
path_tmp.clear();
path_best.clear();
for (int i = 0; i < row; ++i)
for (int j = 0; j < col; ++j)
cin >> maze[i][j];
mazeTrack(0, 0);
//输出路径
for (int i = 0; i < path_best.size(); ++i)
{
cout << "(" << path_best[i][0] << "," << path_best[i][1] << ")" << endl;
}
}
}