454.四数相加II
● 383. 赎金信
● 15. 三数之和
● 18. 四数之和
四数相加
4个数组,两两再分,第一组加和放入map,然后第二组加和取反,去map里遍历即可
赎金信
和 242.有效的字母异位词 是一个思路
三数之和、四数之和
这两个题本质思路是一致的,只是4数之和要写的更加细心一些,重点在于剪枝去重。
解法都是双指针法,多一个数就多一层for循环
但四数之和不要判断nums[k] > target 就返回了,三数之和 可以通过 nums[i] > 0 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。比如:数组是[-4, -3, -2, -1],target是-10,不能因为-4 > -10而跳过。但是还可以去做剪枝,逻辑变成nums[i] > target && (nums[i] >=0 || target >= 0)就可以了。
15.三数之和 (opens new window)的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下标作为双指针,找到nums[i] + nums[left] + nums[right] == 0。
四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n2),四数之和的时间复杂度是O(n3) 。