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

暑期前端训练day6

好多天没有更新了,一直在熟悉项目和做需求,下班以后也是累了,直接开摆。
今天来更一下,水几个力扣每日一题,用ts写的,以后每天都打卡一道困难,除了周末。

题1: 力扣困难题,记忆化搜索。

  • 链接:
    题目传送门
  • 先上代码:
function earliestAndLatest(n: number, firstPlayer: number, secondPlayer: number): number[] {let c1 = firstPlayer - 1, c2 = n - secondPlayer;const dp = new Map<number, [number, number]>();const min = (x1: number, x2: number) => Math.min(x1, x2);const max = (x1: number, x2: number) => Math.max(x1, x2);const f = (x: number): [number, number] => {if(dp.has(x)) return dp.get(x) const tmp: Array<number> = [] let c1 = -1, c2 = -1, curIdx = 0 for(let i = 0; i < n; ++ i) { if(x >> i & 1) {if(i + 1 === firstPlayer) c1 = curIdxelse if(i + 1 === secondPlayer) c2 = curIdx  tmp.push(i + 1)curIdx ++ }}if(c1 === tmp.length - 1- c2) {dp.set(x, [1, 1])return [1, 1] }const m = tmp.length const md2 = Math.floor(m / 2) const nk = 1 << md2  let rs1 = n + 1, rs2 = 0 for(let i = 0; i < nk; ++ i ) {let flag = 1, sta = x for(let j = 0; j < md2; ++ j ) {let l = tmp[j], r = tmp[tmp.length - 1 - j]if(i >> j & 1) {if(r === firstPlayer || r === secondPlayer) {flag = 0 break }sta -= (1 << r - 1) }else {if(l === firstPlayer || l === secondPlayer) {flag = 0 break }sta -= (1 << l - 1)  }}if(!flag) continue const [v1, v2] = f(sta)rs1 = min(rs1, v1 + 1) rs2 = max(rs2, v2 + 1) }dp.set(x, [rs1, rs2]) return [rs1, rs2] };const res = f((1 << n) - 1);return res 
}
  • 总结:
    • 其实就是一道记忆化搜索,其实我对他的时间复杂度还是很感兴趣的,我们来探究一下他的时间复杂度,我们考虑最坏情况,当n = 28的时候, 2n/2∗n/2∗2n/4∗n/4∗....=2n/2+n/4+....∗(n/2∗.n/4∗....∗n/8)2^{n/2} * n/2 * 2^{n / 4} * n / 4 * .... = 2^{n/2+n/4+....} * (n / 2 *.n / 4 * .... * n / 8)2n/2n/22n/4n/4....=2n/2+n/4+....(n/2.n/4....n/8),感觉在超时的边缘,但是不知道为什么过了…

    • 并且我在debug的时候吃了一个大亏,写多了C++,C++的除法默认都是取整,因为有int类型。但是js的每次都会算成一个小数,如果要取整,需要用Math.floor处理一下。

还有一些其他的题,太简单了,懒得写题解,已经熟悉用ts去实现这些东西。

题2:

题目传送门

code:

function maxFreeTime(eventTime: number, startTime: number[], endTime: number[]): number {const max: (m1: number, m2: number) => number = (m1, m2) => {if(m1 >= m2) m2 = m1 return m2  }const fn: () => number = () => {const timeRangeList: Array<any> = new Array()for(let i = 0; i < startTime.length; ++ i ) {let l, r if(!i) {if(startTime[i] === 0) {timeRangeList.push([0, 0, i])continue } l = 0 r = startTime[i] }else {l = endTime[i - 1] r = startTime[i] }if(l < r) {timeRangeList.push([l, r, i]) }else {timeRangeList.push([startTime[i],startTime[i],i]) }}if(endTime[endTime.length - 1] < eventTime) {let l = endTime[endTime.length - 1], r = eventTime timeRangeList.push([l, r, undefined]) }else {timeRangeList.push([eventTime, eventTime, undefined])}let n: number = timeRangeList.length let ans = 0const ma = new Array(n).fill(0).map((item, idx) => {const u = timeRangeList[idx][1] - timeRangeList[idx][0]ans = max(ans, u) return u }) const fa = new Array(n).fill(0).map((item, idx) => timeRangeList[idx][1] - timeRangeList[idx][0]) for(let i = n - 2; i >= 0; -- i) ma[i] = max(ma[i], ma[i + 1]) for(let i = 1; i < n; ++ i ) fa[i] = max(fa[i], fa[i - 1])             for(let i = 0; i < n - 1; ++ i ) {const [l, r, ix] = timeRangeList[i] const va = -timeRangeList[i][0] + timeRangeList[i+1][1]const cur = -startTime[ix]+endTime[ix]if((i + 2 < n && ma[i + 2] >= cur) || (i - 1 >= 0 && fa[i - 1] >= cur)) {// console.log("debug")ans = max(ans, va)} // console.log(va, cur)ans = max(ans, va - cur )}return ans }return fn() };

题3:

题目传送门

code:

function countDays(days: number, meetings: number[][]): number {const n: number = meetings.lengthmeetings.sort((a, b) => {if(a[0] === b[0] && a[1] === b[1]) return 0; if(a[0] != b[0]) {if(a[0] < b[0]) return -1; else return 1 }if(a[1] < b[1]) return -1; return 1 })let ans: number = days for(let i = 0; i < n; ++ i ) {let j = i let [l, r] = meetings[i]while(j + 1 < n && meetings[j + 1][0] <= r) {j ++ r = Math.max(r, meetings[j][1] as number) }ans -= (r - l + 1) i = j}return ans 
};
http://www.lryc.cn/news/586261.html

相关文章:

  • 历史数据分析——云南白药
  • 连接池的核心接口和常用属性
  • 基于大模型的鼻咽癌全周期预测及诊疗优化研究报告
  • SQL新手入门详细教程和应用实例
  • 零基础 “入坑” Java--- 九、类和对象(二)
  • 芯片验证之验证策略
  • 【MogDB】一种基于ctid分片并发查询以提升大表查询性能的方式
  • 68 指针的减法操作
  • 【Datawhale AI夏令营】Task2 笔记:MCP Server开发的重难点
  • 使用包管理工具CocoaPods、SPM、Carthage的利弊与趋势
  • tiktok 弹幕 逆向分析
  • 系统性能评估方法深度解析:从经典到现代
  • 数据湖和数据库对比
  • 多层感知机的简洁实现
  • Spring Cloud Gateway中常见的过滤器
  • 【时间之外】尘封的智能套件复活记
  • 【QGC】深入解析 QGC 配置管理
  • Gas and Gas Price
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十课——图像gamma矫正的FPGA实现
  • Git企业级开发(最终篇)
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十一课——图像均值滤波的FPGA实现
  • TCP的socket编程
  • OneCode 3.0架构深度剖析:工程化模块管理与自治UI系统的设计与实现
  • 多路选择器的学习
  • 前端面试专栏-算法篇:24. 算法时间与空间复杂度分析
  • TCP与UDP协议详解:网络世界的可靠信使与高速快递
  • 苍穹外卖-day06
  • docker—— harbor私有仓库部署管理
  • Linux进程管理的核心:task_struct中的双链表与网状数据结构
  • Linux驱动08 --- 数据库