题目:
https://leetcode.cn/problems/4sum-ii/submissions/539038029/
解析:
https://programmercarl.com/0454.四数相加II.html#算法公开课
感觉能做出来,但是没有,这个思路是两个数为一组采用两个for循环记录和,放入map中,其中,map first为和,map second为和的数量;
第三第四个数的和为前两个数的相反数,如成立,则加和;
题目:
https://leetcode.cn/problems/ransom-note/submissions/539042243/
解析:
https://programmercarl.com/0383.赎金信.html
这道题采用与“有效的字母异位词”相似的解法,在最后判断时
for(int i = 0; i < 26; i++) {
// std::cout << record[i] << std::endl;
if(record[i] < 0) {
return false;
}
}
// 采用的是<0而不是!=0
真是不容易,第一次做出来;
题目:
https://leetcode.cn/problems/3sum/submissions/539046563/
解析:
https://programmercarl.com/0015.三数之和.html#算法公开课
这种题,包括下面的四数之和不是我现在能做出来的;
直接看的解析,这里记录一下感受,希望对下次解有帮助。动力源为遍历的i,其余两个指针left,right随着i变化而变化。
这道题框架还很好理解,真正的灵魂是剪枝和去重,剪枝也还好;去重有两个需要注意的地方,i的去重是和前面的比,而不是和后面的比,为啥呢;
因为前面的已经处理过了,不会遗漏。再一个后面采用while去重时一定要有边界条件(right > left)
while(right > left && nums[right] == nums[right - 1]) right--;
while(right >left && nums[left] == nums[left + 1]) left++;
没有边界条件的话,直接报vector处理有问题,应该是跑出边界了。
这道题得多复习一下。
题目:
https://leetcode.cn/problems/4sum/submissions/539051337/
解析:
https://programmercarl.com/0018.四数之和.html
框架与第三题一致,其中k也需要去重和剪枝,这道题也是磕磕绊绊地抄了半天才能编译通过,我感悟还不深,只知道这里不是0,是target,要判断其正负;
i的去重和剪枝是和k当成一个整体来判断。
感觉我需要把三数之和写熟练了再来补这里的感悟。