第322三数之和问题 思路如下 排序数组: 对数组进行排序可以简化后续的查找过程。排序后的数组可以帮助我们更容易地使用双指针技巧来查找满足条件的三元组。 使用哈希表优化: 在排序后的数组中,我们可以使用哈希表来记录每个元素的出现次数。这样可以在遍历过程中快速查找和计数。 三重循环优化: 外层循环固定 i,中层循环固定 j,内层循环使用双指针技巧查找 k。 由于数组已经排序,我们可以通过双指针技巧来减少不必要的计算。 具体步骤 排序数组: 使用 sorted(arr) 对数组进行排序。 使用哈希表记录元素出现次数: 遍历排序后的数组,使用哈希表 count_map 记录每个元素的出现次数。 三重循环遍历: 外层循环固定 i,中层循环固定 j,内层循环使用双指针技巧查找 k。 对于每个 i 和 j,计算 remaining = target - arr[i] - arr[j]。 使用双指针技巧在 arr[j+1:] 中查找 remaining。 计数和取模: 统计满足条件的三元组数量,并对结果取模 10^9 + 7。 示例 假设 arr = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5] 且 target = 8: 排序:arr = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5] 哈希表:count_map = {1: 2, 2: 2, 3: 2, 4: 2, 5: 2} 三重循环: 固定 i = 0(值为1),j = 1(值为1),查找 remaining = 8 - 1 - 1 = 6。 在 arr[2:] 中查找 6,发现没有满足条件的 k。 继续遍历,直到找到所有满足条件的三元组 这题主要使用了以下知识点:
排序:
使用 arr.sort() 对数组进行排序,以便后续操作可以更高效地进行。 哈希表(字典):
使用字典 count_map 记录数组中每个元素的出现次数。 三重循环遍历:
外层两个循环用于固定前两个元素,内层循环通过双指针技巧查找第三个元素,使得三个元素的和等于目标值 t。 双指针技巧:
在有序数组中使用双指针技巧来查找满足条件的第三个元素,从而减少时间复杂度。 取模运算:
使用 MOD = 10**9 + 7 对结果进行取模运算,防止结果过大导致溢出。 二分查找:
在内层循环中使用二分查找来快速定位第三个元素的位置。