进入考试月,这就作为最后一篇了。等7月考完再持续记录!冲!每天还是有完成每日一题的
第 53 场双周赛记录(前三题)
很简单的一道题,利用三个指针,一次多一个单位,同步向右逐个遍历。满足都不相等就记录一次。
class Solution:
def countGoodSubstrings(self, s: str) -> int:
a, b, c = 0, 1, 2
count = 0
for _ in range(len(s)-2):
if s[a]!=s[b] and s[b]!= s[c] and s[c] != s[a]:
count += 1
a += 1
b += 1
c += 1
return count
思路:说了那么多啥都不懂,只有看例子才能知道是啥。先求出尽可能小的数对,然后每个数对求和取到数对中的最大值。有点贪心的思想,这里也用到双指针。简单的从小到大(或者从大到小)排序之后就可以利用两个指针,首先最小的加最大的,然后一次向中间移动指针再求和,返回最大值。
class Solution:
def minPairSum(self, nums: List[int]) -> int:
nums.sort()
left = 0
right = len(nums)-1
newlist = []
while left < right:
newlist.append((nums[left], nums[right]))
left += 1
right -= 1
sumlist = [a+b for a,b in newlist]
return max(sumlist)
5757. 矩阵中最大的三个菱形和
先看这道题的数据量,矩阵范围尽然很小,是接受枚举的题了。那就开始吧。
class Solution:
def getBiggestThree(self, grid: List[List[int]]) -> List[int]:
m, n = len(grid), len(grid[0])
containL = set()
for i in range(m):
for j in range(n):
containL.add(grid[i][j]) # 添加中心
# 找出离中心尽可能长同时保证四向不越界的距离
distance = min(i, j, m-i-1, n-j-1)
# 加上四个角,四个角的距离逐渐增大
for length in range(1, distance+1):
cur = 0
cur += grid[i-length][j]
cur += grid[i+length][j]
cur += grid[i][j+length]
cur += grid[i][j-length]
# 在当前的距离之下,进行四条边的求和
for k in range(1, length):
cur += grid[i-length+k][j-k] # 左上边 从上到下
cur += grid[i+length-k][j-k] # 左下边 从下到上
cur += grid[i-length+k][j+k] # 右上边 从上到下
cur += grid[i+length-k][j+k] # 右下边 从下到上
containL.add(cur)
containL = list(containL)
containL.sort()
return containL[-1:-4:-1]
注:模仿自枚举法
每日一题
231. 2 的幂
看过这道题,只需要查看一下2进制中,2的幂次方是什么样的就好了
# 先看看是什么样字的
a = 1
for _ in range(100):
print(bin(a))
a *= 2
# 会发现都是只有最大位数为1,其他为0
# 这就简单了,只要把a-1,那就相当于所有位都取反。两者一交,如果是2的幂次方,结果就是0
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
if n <= 0: # 当然首要满足是正数
return False
return not (n & (n-1))