1.镜面反射
题目:
有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 0, 1,以及 2。
正方形房间的墙壁长度为 p,一束激光从西南角射出,首先会与东墙相遇,入射点到接收器 0 的距离为 q 。
返回光线最先遇到的接收器的编号(保证光线最终会遇到一个接收器)。
思路:将光纤经过的水平距离和垂直距离分开看,水平方向上每走p,垂直方向上就会走q。所以假设走了水平方向走了mq之后,遇到接收器,此时垂直方向是走了mq,且mq会被p整除。
此时有两个变量需要计算。m如果是偶数,那么接收器在左边。mq/p如果是偶数,接收器会在下面。所以根据这两个计算即可。
换个角度,求出p和q的最小公倍数即可
时间复杂度O(m),空间复杂度O(1)
/**
* @param {number} p
* @param {number} q
* @return {number}
*/
var mirrorReflection = function(p, q) {
let d = 1;
let h = q;
while (h % p) {
d++;
h += q;
}
if ((h / p) % 2) {
return d % 2 ? 1 : 2;
} else {
return 0;
}
};
2.翻转矩阵后的得分
题目:
有一个二维矩阵 A 其中每个元素的值为 0 或 1 。
移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0。
在做出任意次数的移动后,将该矩阵的每一行都按照二进制数来解释,矩阵的得分就是这些数字的总和。
返回尽可能高的分数。
思路:因为是行或者列翻转,用dp1和dp2记录每一行和每一列的翻转次数,
对于第一列,肯定是全部是1时得分最多;后续每一列,就是得将0和1出现的次数分别记录,如果1的数量不小于0的数量,这一列不翻转,否则这一列翻