中等题的简单解法(emo了)
一看到题目第一感觉是用dp,但是我dp一点都没看过呀,觉得一定做不出来,遂准备放弃。突然灵光一闪,好像只要讨论四个方向的情况回家就行(以startPos为原点)😂
这里是以homePos坐标减去startPos坐标得到:
- 第一象限:row<0, col >0;
- 第二象限:row<0, col <0;
- 第三象限:row>0, col <0;
- 第四象限:row>0, col >0;
/**
* @param {number[]} startPos
* @param {number[]} homePos
* @param {number[]} rowCosts
* @param {number[]} colCosts
* @return {number}
*/
var minCost = function(startPos, homePos, rowCosts, colCosts) {
let res = 0;
if (startPos[0] === homePos[0] && startPos[1] === homePos[1]) {
return 0;
}
let row = homePos[0] - startPos[0]; // 行差
let col = homePos[1] - startPos[1]; // 列差
if (row >= 0 && col >= 0) {
for (let i = 0; i < row; i++) {
res += rowCosts[startPos[0] + i + 1];
}
for (let j = 0; j < col; j++) {
res += colCosts[startPos[1] + j + 1];
}
} else if (row >= 0 && col < 0) {
for (let i = 0; i < row; i++) {
res += rowCosts[startPos[0] + i + 1];
}
for (let j = 0; j < Math.abs(col); j++) {
res += colCosts[startPos[1] - j -1];
}
} else if (row < 0 && col >= 0) {
for (let i = 0; i < Math.abs(row); i++) {
res += rowCosts[startPos[0] - i - 1];
}
for (let j = 0; j < col; j++) {
res += colCosts[startPos[1] + j + 1];
}
} else {
for (let i = 0; i < Math.abs(row); i++) {
res += rowCosts[startPos[0] - i - 1];
}
for (let j = 0; j < Math.abs(col); j++) {
res += colCosts[startPos[1] - j -1];
}
}
return res;
};