力扣第 195 场周赛小结

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值