454.四数相加II
题目链接:. - 力扣(LeetCode)
思路:四个数组,分别取一个元素合为零即可,只需要记录有几组.
如果4个for会很高的复杂度,如果让第一个成为哈希表,3个for,复杂度也太高,
两个两个进行操作,使复杂度降到On^2,先穷举前两个数组,放入哈希表,然后再遍历后两个,如果哈西表里面有就count加上他的value.
383. 赎金信
题目链接:. - 力扣(LeetCode)
思路:
判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成
字母用数组实现哈希表,用string.toCharArray(),第一个字符串里面字符对应--,第二个++,最后有小于零则false
15. 三数之和
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:
思路:三个数之和为零,先排序;
用双指针算法,第一个数a用遍历,第二第三个数bc用两个指针,一个从a之后开始,另一个从最后一个元素开始
初始化l,r之后,进行指针的移动寻找合为num的三元组,如果和大于0就r--,让和变小;如果和小于0,l++让和变大;否则就加入三元组到结果里
但是题目要求不重复的三元组,重复情况的发生是只要a或b或c相等,那么这个三元组就一模一样了,因此要对a b c去重,对a去重:如果a和他前一个的元素相等就continue;因为相等的两个数除了三元组中包含这两个相等元素的情况除外,另外的情况以及被前一个数算过了,所以这样可以去重
对b c 去重同理,也是判断和前一个是否相等
用到Arrays.asList(1,2,3)
18. 四数之和
题目链接:. - 力扣(LeetCode)
思路:和三数之和思路一样,先排序;
第一个第二个元素用两个for遍历的方法,两个指针
同样第二个元素也要加上去重,如果j>i+2,进行去重;
还有一个剪枝操作,第一个元素遍历的时候,如果他大于零并且大于target,那第一种元素这种情况下就直接退出