两数和:1. 两数之和 - 力扣(LeetCode)
1)暴力:两层for循环遍历nums,时间 O(n^2),空间O(1)。
2)双指针:先对数组排序nums.sort(),接着用左右指针从两边向中间逼近。时间O(nlogn),空间O(1)。
3)哈希表:对数组遍历一次,用dict保存已访问的元素及其下标,一旦当前数能够与dict中的数构成target,返回结果。
三数和:15. 三数之和 - 力扣(LeetCode)
与两数和类似但需要考虑对结果去重。
1)暴力(不考虑去重):三层for循环遍历nums,时间 O(n^3)。
2)双指针:先对数组排序nums.sort(),一层for循环套一层双指针。时间O(n^2)。通过对index的限制对结果去重。
3)哈希表:两层for循环遍历数组获得两数和的字典;一层for循环遍历数组寻找第三个数以构成三元组。对结果排序、转成tuple、放入set中以去重。时间O(n^2)。
四数和(1):18. 四数之和 - 力扣(LeetCode)
与三数和是一样的:
1)暴力(不考虑去重):四层for循环遍历nums,时间 O(n^4)。
2)双指针:先对数组排序nums.sort(),两层for循环套一层双指针。时间O(n^3)。通过对index的限制对结果去重。
3)哈希表:三层for循环遍历数组获得三数和的字典;一层for循环遍历数组寻找第四个数以构成四元组。对结果排序、转成tuple、放入set中以去重。时间O(n^3)。
四数和(2):454. 四数相加 II - 力扣(LeetCode)
有四个数组,不需要复杂的去重操作。
1)暴力:四层for循环遍历有四元组,时间O(n^4)。
2)哈希表:两层for循环获得两数和的字典。两层for循环寻找后两个数构成四元组。时间O(n^2)。
* 多于一个数组,双指针不好用?