406. 根據身高重建隊列
題解思路
1.先從高到矮排序
2.按照第二個參數k(前面有幾個人)將其放到index爲k的位置
vec的insert用法
iterator insert( iterator loc, const <T>&val );
void insert( iterator loc, size_type num, const <T>&val );
void insert( iterator loc, input_iterator start, input_iterator end );
這題裏用到的是第一種做法,似乎不用加const?
for (vector<int>& p : people) {
res.insert(res.begin() + p[1], p);
}
416. 分割等和子集
題解思路
很明顯是一個01揹包問題
然而我忘記怎麼做了
vector<bool> dp(sum + 1);
dp[0] = true;
for (const int num : nums) {
for (int i = sum; i >= num; --i) {
dp[i] = dp[i] || dp[i - num];
}
}
437. 路徑總和 III
我的思路【Failed】
對於每一個支路,都有多個任務,一個是8,還有上面節點下來的task,第二層是target和target - rootval,我打算用vector來存但是考慮到複雜度太高了就不考慮了
題解思路
使用前綴和,看題解一下子還沒看懂.然後做了一題簡單一點的類似的題
[3,4,7,6,1,3]假設k爲7,求和爲7的子數組個數
使用unordered_map m
來做,需要注意的點.m[0] = 1,i
從0
到len
,如果m[當前的前綴和 - 目標值]存在,
ans += m[presum - target]
m[presum]++
m[0]
是爲了[4+3 -7]這樣的前綴和
回到本題
void dfs(TreeNode* root) {
if (root == nullptr) return;
pre += root -> val;
if (m.find(pre - sum) != m.end()) {
res += m[pre - sum];
}
m[pre]++;
dfs(root -> left);
dfs(root -> right);
m[pre]--;
pre -= root -> val;
}
需要注意的是,trace back的時候,pre要減減,m[pre]也要減減
438. 找到字符串中所有字母異位詞
題解思路
使用滑動窗口比較哈希表。
我卡在比較兩個哈希表相等上了,我用unordered_map存的,要一個一個比較過去有點麻煩.
- skill
使用字母哈希,直接比較兩個vector是否相等就可以了,因爲vector重載了==運算符
for (int i = 0; i < s.size(); ++i) {
window[s[i]]++;
if (window == pch) {
ans.push_back(i - plen + 1);
}
if (i >= plen - 1) {
window[s[i + 1 - plen]]--;
}
}
448. 找到所有數組中消失的數字
題解思路
我只能說是技巧題
有n個數的數組,數均在[1,n]之間,有的數重複了,有的數沒出現,找出沒出現的數的下標
1.把出現的數爲下標的那個數+n
2.遍歷一遍,<n
的數的下標就是沒出現的數.過程中需要考慮基0這個條件
for (int& num : nums) {
int x = (num - 1) % nums.size();
nums[x] += nums.size();
}
vector<int> ans;
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] <= nums.size()) {
ans.push_back(i + 1);
}
}