LeetCode 每日一题 2023/6/19-2023/6/25

news/2024/11/23 3:26:01/

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步


目录

      • 6/19 1262. 可被三整除的最大和
      • 6/20 1595. 连通两组点的最小成本
      • 6/21 LCP 41. 黑白翻转棋
      • 6/22 面试题 16.19. 水域大小
      • 6/23 2496. 数组中字符串的最大值
      • 6/24 1659. 最大化网格幸福感
      • 6/25 1401. 圆和矩形是否有重叠


6/19 1262. 可被三整除的最大和

被三整除余数有三种情况0,1,2
余数为0可以直接加入到结果
余数为1可以和余数为2的一一匹配加入到结果
分别考虑从中不选取最小的三个数的情况 lo,lt分别代表选取的数位置
如果选出个数差为3的倍数 说明选出来的数都可以加入到结果

def maxSumDivThree(nums):""":type nums: List[int]:rtype: int"""ones,twos=[],[]three = 0for num in nums:y = num%3if y==0:three += numelif y==1:ones.append(num)else:twos.append(num)ones.sort(reverse=True)twos.sort(reverse=True)ans = 0lone,ltwo=len(ones),len(twos)for lo in [lone-2,lone-1,lone]:if lo>=0:for lt in [ltwo-2,ltwo-1,ltwo]:if lt>=0 and (lo-lt)%3==0:ans = max(ans,sum(ones[:lo])+sum(twos[:lt]))    return ans+three

6/20 1595. 连通两组点的最小成本

第一组有size1个数 第二组有size2个数
用长度size2的二进制数s来表示第一组中某个数与第二组的连接状态
dp[i][s]表示第一组前i个点与第二组s的连接最小成本


def connectTwoGroups(cost):""":type cost: List[List[int]]:rtype: int"""size1,size2=len(cost),len(cost[0])m = 1<<size2dp=[[float("inf")]*m for _ in range(size1+1)]dp[0][0]=0for i in range(1,size1+1):for s in range(m):for k in range(size2):if s&(1<<k)==0:continuedp[i][s] = min(dp[i][s],dp[i][s^(1<<k)]+cost[i-1][k])dp[i][s] = min(dp[i][s],dp[i-1][s]+cost[i-1][k])dp[i][s] = min(dp[i][s],dp[i-1][s^(1<<k)]+cost[i-1][k])return dp[size1][m-1]

6/21 LCP 41. 黑白翻转棋

遍历每一个.位置 变成黑子后是否有可以翻转的白子
BFS 将可以翻转的白子加入队列中 依次判断

def flipChess( chessboard):""":type chessboard: List[str]:rtype: int"""n,m = len(chessboard),len(chessboard[0])step = [-1,0,1]def check(board,x,y,dx,dy):x+=dxy+=dywhile 0<=x<n and 0<=y<m:if board[x][y]=="X":return Trueelif board[x][y]==".":return Falsex+=dxy+=dyreturn Falsedef bfs(chessboard,i,j):board = [list(x) for x in chessboard]l = [(i,j)]board[i][j]="X"cnt = 0while l:tmp = []for x,y in l:for dx in step:for dy in step:if dx==dy==0:continueif check(board,x,y,dx,dy):nx,ny = x+dx,y+dywhile board[nx][ny]!="X":tmp.append((nx,ny))board[nx][ny]="X"nx+=dxny+=dycnt+=1l=tmpreturn cntans = 0for i in range(n):for j in range(m):if chessboard[i][j]==".":ans = max(ans,bfs(chessboard,i,j))return ans

6/22 面试题 16.19. 水域大小

dfs 注意对角线也算

def pondSizes(land):""":type land: List[List[int]]:rtype: List[int]"""step = [(0,1),(1,0),(-1,0),(0,-1),(1,1),(1,-1),(-1,1),(-1,-1)]n = len(land)m = len(land[0])def dfs(x,y):land[x][y] = 1ans = 1for i,j in step:if 0<=x+i<n and 0<=y+j<m:if land[x+i][y+j]==0:ans += dfs(x+i,y+j)return ansret = []for i in range(n):for j in range(m):if land[i][j]==0:v = dfs(i,j)ret.append(v)ret.sort()return ret

6/23 2496. 数组中字符串的最大值

判断如果是数字 则转换为数字
否则取长度

def maximumValue(strs):""":type strs: List[str]:rtype: int"""ans = 0for s in strs:if s.isdigit():ans = max(ans,int(s))else:ans = max(ans,len(s))return ans

6/24 1659. 最大化网格幸福感

每个网格有 无人 内向 外向 三种状态使用0,1,2表示
每一行n格 可以用n位三进制表示状态
dfs(i,pre,inum,enum) 表示从i行开始上一行状态pre 还剩下inum个内向 enum个外向
最大幸福值 求dfs(0,0,inCount,exCount)
如果i=m 或者 inum=0 and enum=0 说明分配中结束 返回0
枚举当前行的状态0~3^n
ix[cur] 表示当前状态cur中内向人数
ex[cur] 表示当前状态cur中外向人数
f[cur] 表示状态cur中人的初始幸福值
g[pre][cur]表示两个相邻状态行的贡献

def getMaxGridHappiness(m, n, introvertsCount, extrovertsCount):""":type m: int:type n: int:type introvertsCount: int:type extrovertsCount: int:rtype: int"""mx = 3**nf = [0]*mxg = [[0]*mx for _ in range(mx)]h=[[0,0,0],[0,-60,-10],[0,-10,40]]bits=[[0]*n for _ in range(mx)]ix=[0]*mxex=[0]*mxmem = {}def dfs(i,pre,inum,enum):if (i,pre,inum,enum) in mem:return mem[(i,pre,inum,enum)]if i==m or (inum==0 and enum==0):mem[(i,pre,inum,enum)] = 0return 0ans = 0for cur in range(mx):if ix[cur]<=inum and ex[cur]<=enum:a = f[cur]+g[pre][cur]b = dfs(i+1,cur,inum-ix[cur],enum-ex[cur])ans = max(ans,a+b)mem[(i,pre,inum,enum)] = ansreturn ansfor i in range(mx):mask = ifor j in range(n):mask,x = divmod(mask, 3)bits[i][j] = xif x==1:ix[i]+=1f[i]+=120elif x==2:ex[i]+=1f[i]+=40if j:f[i]+=h[x][bits[i][j-1]]for i in range(mx):for j in range(mx):for k in range(n):g[i][j] += h[bits[i][k]][bits[j][k]]return dfs(0,0,introvertsCount,extrovertsCount)

6/25 1401. 圆和矩形是否有重叠

与圆心的距离如果小于等于半径 说明在圆内
在矩形中找一个点(x,y) 使得
a=|x-xCenter| b=|y-yCenter|
a2+b2<=radius^2 则有重叠

def checkOverlap(radius, xCenter, yCenter, x1, y1, x2, y2):""":type radius: int:type xCenter: int:type yCenter: int:type x1: int:type y1: int:type x2: int:type y2: int:rtype: bool"""def check(i,j,k):if i<=k<=j:return 0return i-k if k<i else k-ja = check(x1,x2,xCenter)b = check(y1,y2,yCenter)return a**2+b**2<=radius**2


http://www.ppmy.cn/news/570991.html

相关文章

深入Python网络编程:从基础到实践

Python&#xff0c;作为一种被广泛使用的高级编程语言&#xff0c;拥有许多优势&#xff0c;其中之一就是它的网络编程能力。Python的强大网络库如socket, requests, urllib, asyncio,等等&#xff0c;让它在网络编程中表现优秀。本文将深入探讨Python在网络编程中的应用&#…

汽车行业项目管理面临的5个挑战及解决方案

汽车行业正跨越式地迈向新的未来。其目前的发展主要由四大趋势驱动&#xff1a;连接性、自动驾驶汽车、共享出行和电气化。这给汽车企业带来了诸多挑战&#xff1a;竞争加剧&#xff0c;快速发展带来的频繁变化&#xff0c;与软件公司建立伙伴关系&#xff0c;以及其他相关问题…

Chrome浏览器对应chromedriver版本 最新2019

直接参考下表&#xff0c;根据自己的浏览器版本去下载对应的Chromedriver&#xff1a; ChromeDriver版本 Support Chrome版本 2.46 V71-73 2.45 V70-72 2.44 V69-71 2.43 V69-71 2.42 V68-70 2.41 V67-69 2.40 V66-68 2.39 V66-68 2.38 V65-67 2.37 V64-…

如何让antv x6兼容IE浏览器

如何让antv x6兼容IE浏览器&#xff1a; 可以学习anvt G6的方法去处理&#xff0c;亲测有效。 链接地址&#xff1a;https://antv-g6.gitee.io/zh/docs/manual/FAQ/supportIE解决方法&#xff1a; 1、在main.js中&#xff0c;引入babel-polyfill import babel-polyfill;2、在…

Windows 11如何使用IE浏览器

Windows 11已经彻底移除了我们一直使用的IE浏览器。但是众所周知有一些网站还是一定要通过IE访问&#xff0c;怎么办&#xff1f;很简单&#xff0c;使用Microsoft Edge内置的IE模式就可以了。 在开启任意网页时只要选择右上角的三个点 开启后&#xff0c;网页旁边会有一个IE地…

win11系统怎么使用ie浏览器

平常在使用电脑的时&#xff0c;有些网址必须使用ie浏览器才可以打开&#xff0c;所以电脑系统升级到win11后给使用者带来不便&#xff0c;但也有解决方法。电脑里有ie浏览器的图标&#xff0c;但点击进去却是Microsoft Edge浏览器&#xff0c;并不是ie浏览器。其实电脑里还是有…

Win11如何使用IE浏览器

1.下载ieframe.dll文件。&#xff08;文末有链接。&#xff09; 2.将此文件复制到C:\Windows\System32。 若没有权限右击ieframe.dll文件->属性->安全->编辑 添加->输入对象名称Administrators点击确定。 点击允许&#xff0c;然后将ieframe.dll再复制到C:\Windo…

Win11启动IE浏览器

Win11启动IE浏览器 升级到Win11以后打开IE浏览器会自动跳转到Edge浏览器 下载地址 提取码&#xff1a;wssb 1.运行注册表文件 ieframe.reg 2.到C:/Windows\System32\ieframe.dll右键TrustedInstall赋予权限 3.复制百度云下载的System32文件夹下的ieframe.dll文件进行覆盖 4.到…