P1014 [NOIP1999 普及组] Cantor 表
解题思路
- 和之前的蛇蝎矩阵很像,因此可以先构建一个蛇蝎矩阵
- 因为是z形所以在每个奇数次矩阵的对角线进行交换就可以了,这样就得到了我们需要的矩阵
代码实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <stdbool.h>
#define u unsigned
#define ll long long
#define sc scanf
#define pr printf
#define fr(i, j, n) for (int i = j; i < n; i++)
#define N 10000
int b[N][N];//矩阵
int n;//整数n
int a = 1;//每一列的开始的数值
int as = 2;//行的步长值,刚开始是2
int bs = 1;//列的步长值,刚开始是1
int k = 3;//奇数次的矩阵
int main(int argc, char* argv[])
{
sc("%d", &n);//读入整数n
for (int i = 0; i <= n / 2; i++) {//最多不会超过n / 2行
int t = a;//记录起始值
for (int j = 0; a <= n; j++, bs++) {//给每一列的数赋值,步长值每次加一
b[i][j] = a;//给矩阵赋值
a += bs;//a加步长值就是下一个需要赋值的数
}
a = t + as;//下一行的起始值是t + as
bs = i + 2;//列的步长是i + 2
as++;//行的步长每次加一
}
while ((k - 1) <= n / 2) {//让所有奇数次的矩阵的对角线元素交换
for (int i = 0; i < k / 2; i ++) {//对角线元素交换
int j = k - 1 - i;//i + j == k - 1,就是对角线元素
//交换两个元素
int t = b[i][j];
b[i][j] = b[j][i];
b[j][i] = t;
}
k += 2;
}
//遍历矩阵找到整数n在哪一行和列
for (int i = 0; b[i][0]; i++) {
for (int j = 0; b[i][j]; j++) {
if (b[i][j] == n) {
pr("%d/%d", i + 1, j + 1);
}
}
}
return 0;
}
230.二叉搜索树中第k小的元素
解题思路
- 把二叉搜索树进行中序遍历,得到一个有序的数组
- 对于第k小的元素就是求下标k - 1位置的元素是什么
- 返回有序数组中下标k - 1位置的元素
代码实现
//对二叉搜索树进行中序遍历得到一个有序的数组
void f(struct TreeNode* root, int a[], int* size) {
if (root != NULL) {
f(root -> left, a, size);
a[(*size) ++] = root -> val;
f(root -> right, a, size);
}
}
int kthSmallest(struct TreeNode* root, int k) {
int a[10000] = {0};
int size = 0;
f(root, a, &size);//得到一个有序的数组
return a[k - 1];//因为k从1开始数,所以返回k - 1下标位置的数
}
标签:size,int,题解,矩阵,29,2024,include,root,define From: https://www.cnblogs.com/lwj1239/p/18045291