代码随想录二刷|第三章:哈希表

15.三数之和

1、使用哈希法去重很麻烦,因此用排序+双指针法
2、对a去重:
nums[i] == nums[i-1]
举例:{-1,-1,2} 如果写nums[i] == nums[i+1]就会跳过这一个解
2、对b去重:
while (right > left && nums[right] == nums[right - 1]) right–;
对c去重:
while (right > left && nums[left] == nums[left + 1]) left++;
举例:{0,-1,-1,-1,-1,1,1,1,1}
3、对b和c去重的逻辑要放在收获结果集的下面,否则{0,0,0,0}这样的就一个结果也不会收集了。并且要和收集结果在一个if里面。
找到答案后还要进行双指针的收缩。

18.四数之和

1、 不要判断nums[k] > target 就返回了,三数之和 可以通过 nums[i] > 0 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。
举例:[-4, -3, -2, -1],target = -10
逻辑应该变成nums[i] > target && (nums[i] >=0 || target >= 0)
惯性思维是两数相加会变得更大,其实两个负数相加会变得更小
二级剪枝:

if (nums[k] + nums[i] > target && nums[i] >= 0) {
    break;
}

2、nums[k] + nums[i] + nums[left] + nums[right] > target 会溢出,因此要用long型存储
long sum = (long)nums[i] + nums[j] + nums[left] + nums[right];
是给long加括号,不是给后面的加括号
3、对b去重:
if (j > i + 1 && nums[j] == nums[j-1]) continue;
要从i + 2开始

你可能感兴趣的:(散列表,数据结构)