双指针 两数之和 变种
LCP18.早餐组合
其实是两数之和的变种
双指针一般需要有序
还要注意审题,需要取模的肯定不能用暴力法
class Solution(object):
def breakfastNumber(self, staple, drinks, x):
"""
:type staple: List[int]
:type drinks: List[int]
:type x: int
:rtype: int
"""
staple.sort()
drinks.sort()
left = 0
right = len(drinks) - 1
theSum = 0
Mod = 1000000007
while left < len(staple) and right >= 0:
if staple[left] + drinks[right] <= x:
left = left + 1
theSum = (theSum + right + 1) % Mod
else:
right = right - 1
return theSum
执行用时:400 ms, 在所有 Python 提交中击败了47.83%的用户
内存消耗:23.5 MB, 在所有 Python 提交中击败了56.52%的用户
LCP28.采购方案
class Solution(object):
def purchasePlans(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums.sort()
Mod = 1000000007
left = 0
right = len(nums) - 1
theSum = 0
while left < right:
if nums[left] + nums[right] <= target:
theSum = (theSum + right - left) % Mod
left = left + 1
else:
right = right - 1
return theSum
1346.检查整数及其两倍数是否存在
class Solution(object):
def checkIfExist(self, arr):
"""
:type arr: List[int]
:rtype: bool
"""
# arr.sort() 可以不要
for i in range(len(arr)):
for j in range(i + 1, len(arr)):
if arr[i] < 0 and arr[j] < 0 and arr[j]* 2 == arr[i]:
return True
elif arr[i] > 0 and arr[j] > 0 and arr[i] * 2 == arr[j]:
return True
elif arr[i] == 0 and arr[j] == 0:
return True
return False
方法二:排序+双指针
方法三:哈希