1、判断路径是否相交
1、题目描述:
2、题解:
哈希表法
设置哈希表,遍历path,如果遇到在哈希表中的坐标,找到返回True;否则就添加进哈希表中。
class Solution:
def isPathCrossing(self, path):
if not path:
return False
hashset = set()
hashset.add((0,0))
direction = {'S':[0,-1],'N':[0,1],'W':[-1,0],'E':[1,0]}
n = len(path)
road = [[0,0]]
for i in range(0,n):
x,y = direction[path[i]]
new_x,new_y = road[-1][0] + x,road[-1][1] + y
if (new_x,new_y) in hashset:
return True
hashset.add((new_x,new_y))
road.append([new_x,new_y])
return False
2、检查数组对是否可以被 k 整除
1、题目描述:
2、题解:
哈希表法
和哈希表:力扣1010. 总持续时间可被 60 整除的歌曲,思路差不多
先把原数组每个元素都对k求余,形成一个新的数组
然后,计算数组中每个余数出现的次数
然后判断两个相加等于k的余数出现的次数是否一样,如果不一样就返回False
最后返回True
代码如下:
代码1
class Solution:
def canArrange(self, arr: List[int], k: int) -> bool:
c=Counter(a%k for a in arr)
if k&1:#k为奇数
for i in range(1,k//2+1):
if c[i]!=c[k-i]:
return False
else:
for i in range(1,k//2):
if c[i]!=c[k-i]:
return False
if c[k//2]&1:如果c[k//2]为奇数
return False
return True
或者:
代码2
class Solution:
def canArrange(self, arr: List[int], k: int) -> bool:
d = collections.Counter()
for x in arr:
d[x % k] += 1
if d[0] % 2 != 0:#如果余数为0出现的次数不是偶数个,则不能满足题意
return False
for i in range(1,k):
if d[i] != d[k - i]:
return False
return True
或者:
代码3
class Solution:
def canArrange(self, arr: List[int], k: int) -> bool:
d = collections.defaultdict(int)
for t in arr:
d[t % k] += 1
if d[0] % 2 != 0:
return False
for i in range(1,k):
if d[i] != d[k - i]:
return False
return True
3、满足条件的子序列数目
1、题目描述:
2、题解:
排序后遍历
class Solution:
def numSubseq(self, nums: List[int], target: int) -> int:
nums.sort()
res = 0
n = len(nums)
j = n - 1
s = 10 ** 9 + 7
for i in range(n):
while j >= i and nums[j] + nums[i] > target:
j -= 1
if j < i:
break
res = (res + 2 ** (j - i)) % s
return res
4、满足不等式的最大值
1、题目描述:
2、题解:
和力扣1014. 最佳观光组合(三种方法,逐步优化)思路有点类似
思路
因为xi < xj ,如果i< j ,那么求yi+yj+|xi-xj|的最大值,就是求yi+yj+xj-xi也即是yi-xi+xj+yj的最大值。并且注意xj-xi<= k
一开始我们设置一个数组,q来保存[(points[0][1] - points[0][0], points[0][0])]
循环体,j 在[1,len(points)):
循环处理 q中不满足xj-xi<= k的情况
如果t没有超过q的长度:
更新最大值
循环处理q的第一个位置的元素不大于yi-xi的情况:移除
添加进新的数值
代码如下:
class Solution:
def findMaxValueOfEquation(self, points: List[List[int]], k: int) -> int:
q = [(points[0][1] - points[0][0], points[0][0])]
t = 0
ret = -10 ** 9
for i in range(1, len(points)):
while t < len(q) and points[i][0] - q[t][1] > k:
t += 1
if t < len(q):
ret = max(ret, points[i][1] + points[i][0] + q[t][0])
while len(q) > t and q[-1][0] <= points[i][1] - points[i][0]:
q.pop()
q.append((points[i][1] - points[i][0], points[i][0]))
return ret