本題為12月1日力扣每日一題
題目來源:力扣第1779題
題目tag:模擬
題面
題目描述
給你兩個整數 x 和 y ,表示你在一個笛卡爾坐標系下的 (x, y) 處,同時,在同一個坐標系下給你一個陣列 points ,其中 points[i] = [ai, bi] 表示在 (ai, bi) 處有一個點,當一個點與你所在的位置有相同的 x 坐標或者相同的 y 坐標時,我們稱這個點是有效的,
請回傳距離你當前位置曼哈頓距離最近的有效點的下標(下標從0開始),如果有多個最近的有效點,請回傳下標最小的一個,如果沒有有效點,請回傳-1,
兩個點 (x1, y1) 和 (x2, y2) 之間的曼哈頓距離為 abs(x1 - x2) + abs(y1 - y2) ,
示例
示例 1
輸入:
x = 3, y = 4, points = [[1,2],[3,1],[2,4],[2,3],[4,4]]
輸出:
2
解釋:
所有點中,[3,1],[2,4] 和 [4,4] 是有效點,有效點中,[2,4] 和 [4,4] 距離你當前位置的曼哈頓距離最小,都為 1 ,[2,4] 的下標最小,所以回傳 2 ,
示例 2
輸入:
x = 3, y = 4, points = [[3,4]]
輸出:
0
提示:
答案可以與你當前所在位置坐標相同,
示例 3
輸入:
x = 3, y = 4, points = [[2,3]]
輸出:
-1
解釋:
沒有有效點,
提示
1 <= points.length <= $ 10^4 $
points[i].length == 2
1 <= x, y, ai, bi <= $ 10^4 $
思路分析
很簡單的一道模擬題,直接按照題意做就行.
參考代碼
class Solution
{
public:
int nearestValidPoint(int x, int y, vector<vector<int>> &points)
{
int res = -1, minLen = 0x3f3f3f3f; // 存放最大距離點的下標和最大距離
for (int i = 0; i < points.size(); i++)
{
if (points[i][0] == x && minLen > fabs(points[i][1] - y)) // x坐標相同且距離更小
{
// 更新兩個資料
res = i;
minLen = fabs(points[i][1] - y);
}
else if (points[i][1] == y && minLen > fabs(points[i][0] - x)) // y坐標相同且距離更小
{
// 更新兩個資料
res = i;
minLen = fabs(points[i][0] - x);
}
}
return res;
}
};
"正是我們每天反復做的事情,最終造就了我們,優秀不是一種行為,而是一種習慣" ---亞里士多德
這里是浙江理工大學22屆ACM集訓隊的成員一枚鴨!
本文首發于博客園,作者:星雙子,除了我自己的轉載請注明原文鏈接:https://www.cnblogs.com/geministar/p/LeetCode1779.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538954.html
標籤:其他
上一篇:劍指offer題解C++版
下一篇:末日生存更新12.1
