2024年2月29号题解

P1014 [NOIP1999 普及组] Cantor 表

解题思路

  1. 和之前的蛇蝎矩阵很像,因此可以先构建一个蛇蝎矩阵
  2. 因为是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小的元素

解题思路

  1. 把二叉搜索树进行中序遍历,得到一个有序的数组
  2. 对于第k小的元素就是求下标k - 1位置的元素是什么
  3. 返回有序数组中下标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下标位置的数
}

 

posted @ 2024-02-29 21:34  lwj1239  阅读(12)  评论(0)    收藏  举报