题目1
给定一个无序的数组,数组内的数字可重复,求要使得这个数组内元素按升序排列元素交换的最少次数是多少?
输入:
[2, 1, 2, 1, 2, 1]
输出:
2
题目2
给一个由数字,"(", “)” 以及 “,” 所组成的字符串,如 “9(18(12,12),(11))”,其中每一对“()”代表一个级别,可以嵌套,级别从0开始,9没有在"()“内,所以9的级别为0,18在第一个”()"内,级别为1,12,12在第二个“()”内,所以级别为2,11也在第二个括号内,级别为2。输出所有数字*级别的和
输入:
“9(18(12,12),(11))”
输出:
88
题目3
给定一个n*m的矩阵,其中矩阵中有k个噪音点,每个噪音点都具有一个分贝值。而且噪音点可以从8个方向向周围扩散,并且当噪音的分贝值为1时,停止扩展散。扩散时,小的噪音值会被大的噪音值覆盖,并且总是保留最大的噪音值。求最后扩散完成时,整个矩阵中所有噪音值的总和。
输入:
第一行为 n,m, k
接下来的 k 行,每行包括三个数,x,y, value
其中 x,y表示噪音点的坐标(从0开始),value表示噪音的分贝值
5 6 2
3 4 3
1 1 4
输出:
63
题解:
第一题:
- 首先对copy一份数组,然后对其排序,得到升序排序的结果。将排序好的数组和原数组的每个元素进行比较,如果不相同,那表明该元素在原数组中必然会被交换的,用 cnt 记录下来。所以最少交换次数即为 cnt/2
第二题:
- 字符串处理,括号匹配的变种,用栈来记录“(”的个数,栈的大小即为当前数字的级别,遇到“)”则出栈,每次遇到数字即可计算 数字*级别就行
第三题
- 典型的BFS题目,首先将噪音点看成一个三元组(x, y, val)入队列,随后从队列中取出一个元素,从8个方向扩散,扩散时需要判断当前点的分贝值与扩散后的分贝值的大小,如果当前点的分贝值比扩散后的要大,则continue,否则将该点入队列继续扩散。需要注意的时,输入的噪音点可以重复,维护分贝值最大即可。