记录 1 道算法题
移除最多的同行或同列石头
要求:放一个石头的时候,如果有跟他在同一行或同一列的石头,则移除与他同行或同列的那个石头。需要得出最大的移除数量。
要得到最大的移除数量说明需要将石头串起来放,像贪吃蛇的形状,放一个拿一个,所以需要得出相连的石头有多少个。集合问题可以用并查集解决,问的是可以移除最多的石头,那就是除了单独的石头的集合之外,其他有两个以上的石头的集合都是符合的,所以只需要计算有多少个单独的石头的集合就可以了。还有每个集合都会剩最后一个石头不会被移除。所以比较好的做法是当产生连接时消除那个石头/集合,即 -1。
因为是坐标系,所以肯定会出现 x 与 y 重复的情况,所以要额外进行区分。因为坐标系是 10的4次方大小,所以 x = x + 10001。额外处理 y 也行,只要处理一个就行。
采用相同的行或相同的列为一个集合。
function removeStones(stones) {
const parent = {}
let count = 0
for(let i = 0; i < stones.length; i++) {
let [x, y] = stones[i]
x = x + 10001
// 记录单独的集合
if (parent[x] === undefined) {
parent[x] = x
count++
}
// 记录单独的集合
if (parent[y] === undefined) {
parent[y] = y
count++
}
// 如果两个集合可以连接,就消去一个石头
const a = find(parent, x)
const b = find(parent, y)
if (a === b) continue
parent[b] = a
count--
}
return stones.length - count
}
function find(parent, i) {
if (parent[i] !== i) {
parent[i] = find(parent, parent[i])
}
return parent[i]
}
结束