1.5 三指针
333字约1分钟
2024-11-25
注:部分题目已整理到「2.3.3 恰好型滑动窗口」中。
class Solution: def arithmeticTriplets(self, nums: List[int], diff: int) -> int: res = 0 for i in range(len(nums)): if nums[i] + diff in nums and nums[i] + 2 * diff in nums: res += 1 return res
时间复杂度:O(n)
空间复杂度:O(1)
两个指针left和right从后往前找到符合的区间,计算区间元素个数,第三个指针从前往后遍历。
class Solution: def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int: nums.sort() res = 0 left = right = len(nums) for j, num in enumerate(nums): while right and nums[right - 1] > upper - num: right -= 1 while left and nums[left - 1] >= lower - num: left -= 1 res += min(j, right) - min(j, left) return res
时间复杂度:O(nlogn)
空间复杂度:O(1)
思考
做了一些题目后,请总结:滑动窗口和双指针的区别是什么?
提示
阿囧说:滑动窗口需要维护窗口内的状态,整个窗口内的元素共同构成了正确答案;
双指针更多的是考虑两个具体指针处的状态,指针中间则不考虑,同向双指针和滑动窗口最为接近。