当前位置: 首页 > news >正文

LeetCode 每日一题 2024/10/14-2024/10/20

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


目录

      • 10/14 887. 鸡蛋掉落
      • 10/15 3200. 三角形的最大高度
      • 10/16 3194. 最小元素和最大元素的最小平均值
      • 10/17 3193. 统计逆序对的数目
      • 10/18 3191. 使二进制数组全部等于 1 的最少操作次数 I
      • 10/19 3192. 使二进制数组全部等于 1 的最少操作次数 II
      • 10/20 908. 最小差值 I


10/14 887. 鸡蛋掉落

动态规划
1.dp[K][N]代表K个鸡蛋 N层最坏情况的最少次数
2.dp[k][m]=n k个鸡蛋 可以扔m次 最坏情况下最多可以测n层楼
dp[k][m] = 1+ dp[k,m-1]#没碎+dp[k-1,m-1]#碎了

def superEggDrop(K, N):""":type K: int:type N: int:rtype: int"""mem={}def dp(K,N):if K==1:return Nif N==0:return 0if (K,N) in mem:return mem[(K,N)]res = float('INF')lo,hi=1,Nwhile lo<=hi:mid=lo+(hi-lo)//2broken = dp(K-1,mid-1) #碎了not_broken = dp(K,N-mid),  #没碎if broken>not_broken:hi = mid -1res = min(res,broken+1)else:lo = mid+1res = min(res,not_broken+1)mem[(K,N)]=resreturn resreturn dp(K,N)def superEggDrop2(K, N):""":type K: int:type N: int:rtype: int"""dp = [[0]*(N+1) for _ in range(K+1)]m = 0while dp[K][m]<N:m+=1for k in range(1,K+1):dp[k][m] = dp[k][m-1] + dp[k-1][m-1]+1return m

10/15 3200. 三角形的最大高度

分别判断红、蓝先放第一排的两种情况

def maxHeightOfTriangle(red, blue):""":type red: int:type blue: int:rtype: int"""def check(odd,even):cur = 1while True:print(odd,even,cur)if cur%2==1:if odd>=cur:odd-=curelse:breakelse:if even>=cur:even-=curelse:breakcur+=1return cur-1return max(check(red,blue),check(blue,red))

10/16 3194. 最小元素和最大元素的最小平均值

从小到大排列 依次求平均值

def minimumAverage(nums):""":type nums: List[int]:rtype: float"""nums.sort()ans = nums[-1]n=len(nums)for i in range(n//2):ans = min(ans,(nums[i]+nums[n-1-i])*1.0/2)return ans

10/17 3193. 统计逆序对的数目

https://leetcode.cn/problems/count-the-number-of-inversions/solutions/2946689/tong-ji-ni-xu-dui-de-shu-mu-by-leetcode-qsk7r/?envType=daily-question&envId=2024-10-18

def numberOfPermutations(n, requirements):""":type n: int:type requirements: List[List[int]]:rtype: int"""MOD=10**9+7req = {0:0}for end,cnt in requirements:req[end]=cntif req[0]>0:return 0mem = {}def dfs(end,cnt):ans = 0if (end,cnt) in mem:return mem[(end,cnt)]if cnt<0:return 0if end==0:return 1if end-1 in req:r = req[end-1]if r<=cnt<=end+r:ans = dfs(end-1,r)mem[(end,cnt)]=ansreturn anselse:mem[(end,cnt)]=ansreturn anselse:if cnt>end:ans = (dfs(end,cnt-1)-dfs(end-1,cnt-1-end)+dfs(end-1,cnt))%MODmem[(end,cnt)]=ansreturn anselse:ans = (dfs(end,cnt-1) + dfs(end-1,cnt)) % MODmem[(end,cnt)]=ansreturn ansreturn dfs(n-1,req[n-1])

10/18 3191. 使二进制数组全部等于 1 的最少操作次数 I

对于同个位置起始的操作两次等于没有操作 所以每个位置起始的操作最多1次
对不同的几个操作 顺序并不会改变最后的操作结果
所以从左到右操作即可
从头到尾遍历 遇到0进行翻转
最后查看数组最后两位是否为1

def minOperations(nums):""":type nums: List[int]:rtype: int"""ans=0for i in range(len(nums)-2):if nums[i]==0:nums[i+1]^=1nums[i+2]^=1ans+=1return ans if nums[-1] and nums[-2] else -1

10/19 3192. 使二进制数组全部等于 1 的最少操作次数 II

最左侧的0必须进行反转操作
为了使得反转次数最少 从左至右依次判断
遇到0就需要反转

def minOperations(nums):""":type nums: List[int]:rtype: int"""ans = 0for num in nums:if (num+ans)%2==0:ans+=1return ans

10/20 908. 最小差值 I

找到当前最大值a 最小值 b
a可以减小k b可以增加k
a-b的差值最多可以减少2k

def smallestRangeI(nums, k):""":type nums: List[int]:type k: int:rtype: int"""return max(0,max(nums)-min(nums)-2*k)


http://www.mrgr.cn/news/54386.html

相关文章:

  • 代码训练营 day41|LeetCode 1049,LeetCode 494,LeetCode 474
  • Redis架构演进之单机版Redis和数据持久化
  • vue 页面导出gif图片 img 导出gif 超简单~
  • gbn,sr和tcp的区别
  • 使用finalshell远程ssh连接ubuntu
  • 速盾:直播cdn加速原理是什么?
  • A股反弹行情结束了吗?
  • 设计模式的六大原则详解与应用
  • Dubbo的扩展与挑战拥抱微服务与云原生
  • 力扣1011.在D天内送达包裹的能力
  • 【云原生】Docker 部署 Nacos使用详解
  • 天童教育:家长如何引导孩子表达自己
  • 高等数学 7.1 微分方程的基本概念
  • Java最全面试题->Java基础面试题->JavaWeb面试题->Git/SVN面试题
  • Spring容器详解:BeanFactory和ApplicationContext的不同
  • 在 Docker 中搭建 PostgreSQL16 主从同步环境
  • 大学生入学审核|基于springBoot的大学生入学审核系统设计与实现(附项目源码+论文+数据库)
  • # Go 语言中的 Interface 和 Struct
  • 在线图片翻译有哪些?快速识别并翻译图中文字就用它
  • 字节回应实习生破坏大模型训练:确有此事 但部分报道夸大失实
  • C# Linq常用方法
  • Django 测试指南
  • NVIDIA cuDNN
  • SpringCloud学习:Seata总结与回顾
  • Qt开发技巧(十七):新窗口控件用智能指针,将一些配置类变量封装起来,Qt窗体的Z序叠放,子窗体的释放,Qt中的事件发送,Qt的全局头文件
  • 二、见招拆招:ShardingJDBC分库分表实战指南