哈希表刷题

383.赎金信:这道题和有效字母异位词很像,那道题是判断两个单词是否可以相互组成。而这道题是单向的,只用判断用magazine中的字母能否组成ransomNote即可,而不用关心ransomNote能否组成magazine。这道题做法与有效字母异位词完全一致。

15.三数之和:这道题如果用暴力的做法,会有五个题运行超时。所以肯定不能直接使用暴力解法。这道题棘手的问题在于:结果中不可包含重复的三元组。如果把符合的三元组加入结果集合result中,然后再去重;或者说将每个要加入的三元组的三个数字进行排序,确定和结果中已经存在的子集合不完全相同再加入都很复杂,很容易超时。

在进行判断的时候,比如集合{-1, 0, 1, 2, -1, -4},通过排序可以得到{-4, -1, -1, 0, 1, 2}。我们不希望出现两次(-1,0,1),但是-1可以在一个结果中出现两次,(-1,-1,2)。所以外层循环以-1为起点的时候,可以找到(-1,-1,2)和(-1,0,1)。但是当下一次,仍以-1为起点的时候,就可以省略此次的检查了。直接从以0为起点开始检查即可。

这个题的难点在于if(i>0&&nums[i]==nums[i-1]),这个不能写成if(i>0&&nums[i+1]==nums[i]),否则会遗漏(-1,-1,2)。

同理while(left<right&&nums[right]==nums[right-1])中left<right也必须要这么写。否则会遗漏(0,0,0)。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务