代码随想录算法训练营第7天|哈希表Part02

记录题目:

  • 三数之和
  • 四数之和
  • 赎金信

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

  • threeSum 中,必须注意值和下标的区别三元组加入结果后要及时移动指针并去重, 否则容易造成重复结果或死循环

  • 提前终止无效枚举 if (nums[i] > 0) break; 这条语句的威力非常大!

    • nums 是升序的,一旦最小值都大于 0, 后面 nums[i] + nums[left] + nums[right] > 0 一定永远不会等于 0。

    • 所以这条剪枝可以提前跳出主循环,直接减少上百上千次不必要的遍历。 时间复杂度虽然还是 O(n²),但实际遍历次数可能减少一半甚至更多。 即使是 O(n²),也能在工程实现上有非常明显的“快慢之分”!这种常数项优化在刷题实战中非常关键。

  • 对于 sum 不等于 0 的情况, leftright 不用去重,因为这个组合不会被推入结果数组。

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×