每日一题——不定时日更
Match 14th: Design Hashmap
- problem: https://leetcode-cn.com/problems/design-hashmap/
- tags: hash
- Solution: 蠢蠢的线性探测
遇到的问题:遇到了莫名其妙的错误,懵比了半天
解决方法:线性探测在删除之后offset仍不变,如果偷懒不记录offset,删除前面的key,key值变为-1,查询同样hash value的key会导致不能依据遇到-1就停止。违反逻辑以提升性能,纯属自作聪明了。
经验:如果找不出错误,就重新选择、排列操作,从而定位问题点。
March 12th: Verify Preorder Serialization of a Binary Tree
- tags: stack
- problem: https://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree/
主要要建立插槽的概念,每加入一个数都增加两个slot,消耗一个slot,遇到非数则消耗一个slot。进一步可以简化为一个slot计数器。
感想: 要把想法概念化,这样更容易理解和做题。
March 7th: Palindrome Partitioning
- tags: dfs, dp, 记忆化搜索
- problem: https://leetcode-cn.com/problems/palindrome-partitioning/
dfs
其实dfs就是第一层循环内递归
在这题中,用dfs判断以i起点的子串是否能划分成【所有划分都是回文串】,就是
1.【回文串划分】以i为起点的子串一次,找到边界j0, j1, j2, ...
2. 再次对每个j调用dfs判断余下的子串[j+1, ...]。
void isValidPart(str, i)
{
// termination
if(i == n)
{
ans.push_back(ans_part);
return;
}
// recursion
for(int j = i; j < n; ++j)
{
if(isPalindrome(str, i, j))
{
ans_part.push_back(str.substr(i, j - i + 1));
isValidPart(str, j + 1);
ans_part.pop_back();
}
}
dp
dp关键思想就是递推式(由已知得未知)
在这题中,dp用来判断一个子串是否是回文串
dp[i][j] = (str[i] == str[j] && dp[i+1][j-1])
记忆化搜索
记忆化搜索是懒惰搜素,并记录搜索过程中产生的所有有用结果,迎合了dp的需求
在这题中,不适用遍历所有(i, j)来计算所有dp,仅当(i, j)需要被获取时才递归地计算并记录。
- 令dp[i][j]有三态:
enum{TRUE, FALSE, NO_RECORED} - 每次调用都记录结果:
return dp[i][j] =
int isPalindrome(str, i, j)
{
if(dp[i][j])
return dp[i][j];
if(i >= j)
return dp[i][j] = true;
return dp[i][j] = (str[i] == str[j]) ? isPalindrome(str, i+1, j-1) : false;
}

浙公网安备 33010602011771号