因為資料量較小,可以使用o(n
2)o(n^2)
o(n2
)的暴力方案。借助 std::vector::insert 方法快速實現。
class
solution
return infovec;}}
;
先思考最直接的方法:
列舉每個數的因子。設最大值為m
mm,則時間複雜度為o(n
∗m)o(n*m)
o(n∗m)
。檢查每個數因子的個數,並累加符合要求的因子。時間複雜度為o(n
)o(n)
o(n)。
因為 n,m 都較大,直接按上述方法暴力肯定是要超時的。那麼來思考下如何優化。
觀察發現,耗時主要集中在第一步,那麼就來搞一搞它!
我們現在時先列舉數字,再列舉它的因子,那麼能不能反過來呢?先列舉因子,然後列舉有可能被該因子整除的數字。好像是可行的,不過別慌,先讓我們來估計下時間複雜度:
列舉因子。設最大因子為m
mm,則時間複雜度為o(m
)o(m)
o(m)
。對於每個因子 x 。列舉可以被其整除的數字。設最大的數字取值不超過 n,則該步驟的時間複雜度為 o(n
/x)o(n/x)
o(n/x)
。 總結一下,上述演算法的時間複雜度為 o(m
∗n)o(m*\sqrt n)
o(m∗n
)。已經足夠解決題目給出的資料了。
bool flag =
false
;unordered_map<
int, unordered_set<
int>> eledict;
void
init()
}}class
solution
int sum =0;
for(
auto it = nums.
cbegin()
; it != nums.
cend()
;++it)}}
return sum;}}
;
典型的圖的優先搜尋問題。比較考驗處理細節的能力。
可以借助 std::queue 來機率待搜尋的點,借助 std::unordered_set 記錄已訪問的點。每次從 queue 的隊首取出待搜尋節點,記為 f,然後列舉 f 周圍的四個節點,根據題目給出的 street-type 判斷是否可達。
int dx=
;int dy=
;class
solution}if
(dir ==1)
}if(dir ==2)
}if(dir ==3)
}return
false;}
bool
hasvalidpath
(vector
int>>
& grid)
for(
int i =
0; i <
4; i++)if
(next.first <
0|| next.first >= grid.
size()
|| next.second <
0|| next.second >= grid[0]
.size()
)if(false
==isaccess
(grid[f.first]
[f.second]
, grid[next.first]
[next.second]
, i)
) q.
push
(next)
; mark.
insert
(next);}
}return
false;}
};
可以使用 hash 演算法,o(n)搞定該問題。
首先假設有乙個足夠大的資料型別可以裝下我們所需要的數字。後面會優化掉對該假設的依賴~
對於長度為 i 的字首,我們可以計算其hash值,計算公式如下:
p re
fix(
i)=∑
j=0i
−1∗(
s[i]
−′a′
)∗sa
ltjprefix(i) = \sum^_*(s[i]-'a')*salt^
prefix
(i)=
∑j=0
i−1
∗(s[
i]−′
a′)∗
salt
j 對於長度為 i 的字尾,我們可以計算其hash值,設字串長度為 n,計算公式如下:
s uf
fix(
i)=∑
j=0i
−1(s
[n−i
+j]−
′a′)
∗sal
tjsuffix(i) = \sum_^(s[n-i+j]-'a')*salt^
suffix
(i)=
∑j=0
i−1
(s[n
−i+j
]−′a
′)∗s
altj
salt 是乙個隨機數,但最好是乙個大的質數。
分析上述兩個公式會發現,如果長度為 i 的字首和字尾相等,那麼必然有 prefix(i) == suffix(i)。而且在滿足前述假設的前提下,不相等的字首和字尾必然有 prefix(i) ≠ suffix(i)。
但是可惜的是,並沒有在大多數程式語言中,並不存在這樣的資料型別。從而導致了hash值衝突的問題,即不相等的字首和字尾其hash值也有可能相同。那麼如何解決該問題呢?
借鑑於通用的解決hash衝突的辦法,我們可以增加 salt 的個數,以降低衝突的概率。當長度為 i 的字首和字尾對於所有salt都相等時,我們才認為其真正的相等。
leetcode 第181場周賽
第一次做周賽,只做出了兩道題,主要問題是數學基礎不牢並且對於字串kmp演算法沒掌握。因為資料量比較小,所以採取了暴力直接insert。輸入 nums 0,1,2,3,4 index 0,1,2,2,1 輸出 0,4,1,3,2 解釋 nums index target 0 0 0 1 1 0,1 2...
leetcode第 181 場周賽
給你兩個整數陣列nums和index。你需要按照以下規則建立目標陣列 請你返回目標陣列。題目保證數字插入位置總是存在。輸入 nums 0,1,2,3,4 index 0,1,2,2,1 輸出 0,4,1,3,2 解釋 nums index target 0 0 0 1 1 0,1 2 2 0,1,2...
leetcode 第132場周賽
愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字n。在每個玩家的回合,玩家需要執行以下操作 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取得勝利時才返回true,否則返回false。假設兩個玩家都以最佳狀態參與遊戲。示例 1 輸入 2輸出 true解釋 愛...