基于目标关系的数组问题解法总结
在处理数组问题时,当问题中描述元素之间存在某种确定关系时,可以选择不同的解法来高效求解:
-
基于特定关系的匹配问题
-
这里的arr[i] 和arr[j] 存在一种确定关系(由 == 相连),所以可以借鉴 Two Sum 的思路,通过一个
unordered_set/'unordered_map' 和单次遍历single for loop快速查找满足条件的配对。比如 1346. Check If N and Its Double Exist -
类似问题:
- 2006. Count Number of Pairs With Absolute Difference K
在这里,目标关系是绝对值,需要检查nums[i] + k和nums[i] - k是否存在。但逻辑一致。
- 2006. Count Number of Pairs With Absolute Difference K
-
-
目标为范围的匹配问题
- 如果目标是一段范围(如2563. Count the Number of Fair Pairs
),可以通过
upper_bound和lower_bound来快速统计满足范围的配对,极大简化实现和提升性能。
- 如果目标是一段范围(如2563. Count the Number of Fair Pairs
public:
long long countFairPairs(vector<int>& nums, int lower, int upper) {
long long count = 0;
sort(nums.begin(), nums.end());
// lower - nums[i] <= nums[j] <= upper - nums[j]
for(int j = 0; j < nums.size(); j++){
auto lb = lower_bound(nums.begin(), nums.begin() + j, lower - nums[j]);
auto ub = upper_bound(nums.begin(), nums.begin() + j, upper - nums[j]);
count += ub - lb;
}
return count;
}
};
链表问题多画图。按照b站上灵茶山艾府的链表题画图。分单数和双数俩种情况分别画图。