每日一題 0126

2022-09-19 17:33:11 字數 1021 閱讀 9245

(2022.01.26)每日一題 檢測正方形

蕪湖,中等題,第一想法,算出所有的點,遍歷查詢,屬實腦子不對勁。然後想到使用雜湊表,儲存所有的點出現及其出現的次數。

因為已知了乙個查詢點,那麼軸對齊正方形的各個頂點就會非常好算。當查詢點\((x,y)\)存在軸對齊正方形時,必然在點集中存在與其 \(x\) 值或 \(y\) 值相同的點,即與查詢點構成的直線平行於 \(x\) 軸或 \(y\) 軸。所以我們使用unorderd_map構建雜湊表,記錄點出現的次數。我們以 \(y\) 值相同,\(x\) 值不同來找第乙個點,當我們找到該點時,我們可以計算出正方形的剩餘兩個點,我們只要去判斷這兩個點是否存在於雜湊表中,並計算次數即可。

為了方便表示,我們設查詢點\(x=(x,y)\),參照點\(y=(x1,y)\),那麼剩下的兩個點的座標分別是\(((x,y+abs(x-x1)),(x1,y+abs(x-x1))\)或\((x,y-abs(x-x1)),(x1,y-abs(x-x1)))\)。最後計算對應兩點的個數相乘後相加即可,當然還要乘以我們參照點的個數。最後需要注意的是一定要將與我們查詢點相同的點篩出,我就是一開始忘記篩出了,就會出錯,這樣按照**的邏輯也是可以計算的,就是計算與查詢點相同的點的個數相乘,相加,再乘以參照點的個數。總而言之就是很弱智的錯誤,用於提醒一下自己。

class detectsquares 

void add(vectorpoint)

int count(vectorpoint)

for(auto& tmp: cnt[y])

return res;

}};/**

* your detectsquares object will be instantiated and called as such:

* detectsquares* obj = new detectsquares();

* obj->add(point);

* int param_2 = obj->count(point);

*/

每日一題 1

題目詳情 peter喜歡玩數字遊戲,但數獨這樣的遊戲對他來說太簡單了,於是他準備玩乙個難的遊戲。遊戲規則是在乙個n n的 裡填數,規則 對於每個輸入的n,從左上角開始,總是以對角線為起點,先橫著填,再豎著填。這裡給了一些樣例,請在樣例中找到規律並把這個n n的 列印出來吧。輸入描述 多組測試資料 資...

每日一題2018 3 21

leetcode 2 模擬十進位制運算考察單鏈表基本操作。題無難點,個人基礎需要提高。definition for singly linked list.struct listnode class solution while p while q if shi val s next null ret...

每日一題2018 3 22

leetcode 03 最長不重複子串 第一反應就是動態規劃。看到了網上的方法一。直接把問題簡化為找兩個重複字元間的最長距離,太巧妙了!class solution if i idx max locs s i i return max ling老師的方法二 仍舊轉化為動態規劃,但是為節省空間不再開個...