LeetCode 每日一题 2024/11/11-2024/11/17

news2024/11/17 9:48:28

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


目录

      • 11/11 1547. 切棍子的最小成本
      • 11/12 3258. 统计满足 K 约束的子字符串数量 I
      • 11/13 3261. 统计满足 K 约束的子字符串数量 II
      • 11/14 3249. 统计好节点的数目
      • 11/15 3239. 最少翻转次数使二进制矩阵回文 I
      • 11/16 3240. 最少翻转次数使二进制矩阵回文 II
      • 11/17 825. 适龄的朋友


11/11 1547. 切棍子的最小成本

从左到右排序 dfs遍历区间[i,j]完成切割的最小成本

def minCost(n, cuts):
    """
    :type n: int
    :type cuts: List[int]
    :rtype: int
    """
    cuts.sort()
    cuts = [0]+cuts+[n]
    
    mem = {}
    def dfs(i,j):
        if (i,j) in mem:
            return mem[(i,j)]
        if i+1==j:
            return 0
        ans = float("inf")
        for k in range(i+1,j):
            ans = min(ans,dfs(i,k)+dfs(k,j))
        ans += cuts[j]-cuts[i]
        mem[(i,j)]=ans
        return ans
    return dfs(0,len(cuts)-1)



11/12 3258. 统计满足 K 约束的子字符串数量 I

如果一个长度为x的字符串满足约束 那么他的子字符串都满足
滑动窗口 固定右端点i 找到最小左端点l
可以得到以右端点结尾的符合子字符串有i-l+1个

def countKConstraintSubstrings(s, k):
    """
    :type s: str
    :type k: int
    :rtype: int
    """
    ans=0
    l = 0
    cnt=[0,0]
    for i,c in enumerate(s):
        cnt[ord(c)&1]+=1
        while cnt[0]>k and cnt[1]>k:
            cnt[ord(s[l])&1]-=1
            l+=1
        ans += i-l+1
    return ans
        



11/13 3261. 统计满足 K 约束的子字符串数量 II

滑动窗口
枚举每个结束位j 统计0,1个数
如果不满足对于当前i j开始不符合条件记录right[i]=j
将左端点i往右移动直至满足
对于[l,r]
右端点在j=right[l]之前的全部满足 (j-l+1)*(j-l)/2
j之后的子字符串使用前缀数组 pre[r+1]-pre[j]

def countKConstraintSubstrings(s, k, queries):
    """
    :type s: str
    :type k: int
    :type queries: List[List[int]]
    :rtype: List[int]
    """
    n=len(s)
    cnt=[0,0]
    right=[n]*n
    pre=[0]*(n+1)
    i=0
    for j in range(n):
        c=s[j]
        cnt[ord(c)&1]+=1
        while cnt[0]>k and cnt[1]>k:
            cnt[ord(s[i])&1]-=1
            right[i]=j
            i+=1
        pre[j+1]=pre[j]+j-i+1
    ans=[]
    for l,r in queries:
        j = min(right[l],r+1)
        v = (j-l+1)*(j-l)//2+pre[r+1]-pre[j]
        ans.append(v)
    return ans



11/14 3249. 统计好节点的数目

叶节点必定是好节点 dfs统计所有子节点个数

def countGoodNodes(edges):
    """
    :type edges: List[List[int]]
    :rtype: int
    """
    n=len(edges)+1
    g = [[] for _ in range(n)]
    for x,y in edges:
        g[x].append(y)
        g[y].append(x)
    ans = 0
    def dfs(x,p):
        global ans
        total = 1
        size = 0
        same = True
        for y in g[x]:
            if y==p:
                continue
            cur = dfs(y,x)
            if size==0:
                size=cur
            elif size!=cur:
                same = False
            total+=cur
        if same:
            ans+=1
        return total
    dfs(0,-1)
    return ans



11/15 3239. 最少翻转次数使二进制矩阵回文 I

分别判断每一行是回文 或者每一列是回文需要翻转的次数

def minFlips(grid):
    """
    :type grid: List[List[int]]
    :rtype: int
    """
    n,m=len(grid),len(grid[0])
    ans1,ans2=0,0
    for i in range(n):
        l,r = 0,m-1
        while l<r:
            if grid[i][l]!=grid[i][r]:
                ans1+=1
            l+=1
            r-=1
    for j in range(m):
        l,r=0,n-1
        while l<r:
            if grid[l][j]!=grid[r][j]:
                ans2+=1
            l+=1
            r-=1
    return min(ans1,ans2)



11/16 3240. 最少翻转次数使二进制矩阵回文 II

对于某个位置i,j 对应位置i,n-1-j; m-1-i,j; m-1-i,n-1-j
四个位置要相同 如果四个综合为cnt 那么需要翻转最少min(cnt,4-cnt)
如果m,n都为奇数 中间位置必定为0
统计m,n为奇数时中间一行或一列 镜像位置不同的对数diff 以及镜像位置相同的1的个数cnt
如果cnt%4==0 那么将diff个1变为0即可
如果cnt%4不为0 必定是2
如果diff>0 将其中一对变为1 其余变为0 即更改diff次
如果diff=0 只能将cnt中两个1变为0

def minFlips(grid):
    """
    :type grid: List[List[int]]
    :rtype: int
    """
    m,n=len(grid),len(grid[0])
    ans = 0
    for i in range(m//2):
        r,r2=grid[i],grid[-1-i]
        for j in range(n//2):
            cnt = r[j]+r[-1-j]+r2[j]+r2[-1-j]
            ans += min(cnt,4-cnt)
    
    if m%2 and n%2:
        ans += grid[m//2][n//2]
    diff = cnt=0
    if m%2:
        r = grid[m//2]
        for j in range(n//2):
            if r[j]!=r[-1-j]:
                diff+=1
            else:
                cnt+=r[j]*2
    if n%2:
        for i in range(m//2):
            if grid[i][n//2]!=grid[-1-i][n//2]:
                diff+=1
            else:
                cnt+=grid[i][n//2]*2
    return ans +(diff if diff else cnt%4)



11/17 825. 适龄的朋友

1.用户x不会对大于自己岁数的y发送好友请求
统计各个年龄各有多少人 存入m
将年龄从小到大排列 生成前缀和数组
统计每个年龄会加好友的区间 二分
2.因为年纪范围知道 计数排序 前缀和

def numFriendRequests1(ages):
    """
    :type ages: List[int]
    :rtype: int
    """
    from collections import defaultdict
    m = defaultdict(int)
    for age in ages:
        m[age]+=1
    ageList = list(m.keys())
    ageList.sort()
    presum = [0,m[ageList[0]]]
    
    for i in range(1,len(ageList)):
        presum.append(presum[i]+m[ageList[i]])
    ans = 0
    for loc,age in enumerate(ageList):
        num = m[age]
        minage = age*1.0/2+7 #大于minage
        if minage<age:
            ans += num*(num-1)
        l,r = 0,loc-1
        while l<=r:
            mid = (l+r)//2
            if ageList[mid]>minage:
                r = mid-1
            else:
                l = mid+1
        if l>=0 and loc>=0:
            ans += (presum[loc]-presum[l])*num
    return ans
    
def numFriendRequests(ages):
    """
    :type ages: List[int]
    :rtype: int
    """
    total = [0]*121
    for age in ages:
        total[age]+=1
    presum = [0]*121
    for i in range(1,121):
        presum[i] = presum[i-1]+total[i]
    ans = 0
    for age in range(15,121):
        if total[age]>0:
            minage = int(age/2+8)-1
            ans += total[age]*(presum[age]-presum[minage]-1)
    return ans



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2242090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

15分钟学 Go 第 53 天 :社区资源与学习材料

第53天&#xff1a;社区资源与学习材料 目标 了解Go语言官方资源掌握社区重要学习平台学会利用开源项目学习构建个人知识体系 一、Go语言官方资源汇总 资源类型网址说明Go官网golang.org官方文档、下载、教程Go Blogblog.golang.org技术博客、最新特性介绍Go Playgroundpla…

丹摩征文活动 |【前端开发】HTML+CSS+JavaScript前端三剑客的基础知识体系了解

前言 &#x1f31f;&#x1f31f;本期讲解关于HTMLCSSJavaScript的基础知识&#xff0c;小编带领大家简单过一遍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 …

【Python · PyTorch】卷积神经网络(基础概念)

【Python PyTorch】卷积神经网络 CNN&#xff08;基础概念&#xff09; 0. 生物学相似性1. 概念1.1 定义1.2 优势1.2.1 权重共享1.2.2 局部连接1.2.3 层次结构 1.3 结构1.4 数据预处理1.4.1 标签编码① One-Hot编码 / 独热编码② Word Embedding / 词嵌入 1.4.2 归一化① Min-…

机器学习-36-对ML的思考之机器学习研究的初衷及科学研究的期望

文章目录 1 机器学习最初的样子1.1 知识工程诞生(专家系统)1.2 知识工程高潮期1.3 专家系统的瓶颈(知识获取)1.4 机器学习研究的初衷2 科学研究对机器学习的期望2.1 面向科学研究的机器学习轮廓2.2 机器学习及其应用研讨会2.3 智能信息处理系列研讨会2.4 机器学习对科学研究的重…

激光slam学习笔记5---ubuntu2004部署运行fastlivo踩坑记录

背景&#xff1a;看看fastlivo论文&#xff0c;觉得挺有意思的&#xff0c;就本地部署跑跑看看效果。个人环境&#xff0c;ubuntu20.04。 一、概要 由于依赖比较多&#xff0c;个人构建工作空间&#xff0c;使用catkin_make编译 src├── FAST-LIVO├── livox_ros_driver…

多模态大模型开启AI社交新纪元,Soul App创始人张璐团队亮相2024 GITEX GLOBAL

随着AI在全球范围内的加速发展和广泛应用,各行业纷纷在此领域发力。作为全球最大的科技盛会之一,2024年的GITEX GLOBAL将目光再次聚焦于人工智能的飞速发展,吸引了超过6700家来自各个领域的企业参与。在这样的背景下,Soul App作为国内较早将AI技术应用于社交领域的平台,首次亮相…

67页PDF |埃森哲_XX集团信息发展规划IT治理优化方案(限免下载)

一、前言 这份报告是埃森哲_XX集团信息发展规划IT治理优化方案&#xff0c;报告中详细阐述了XX集团如何优化IT治理结构以适应新的要求。报告还分析了集团管控模式的变化&#xff0c;提出了六大业务中心的差异化管控策略&#xff0c;并探讨了这些变化对IT治理模式的影响。报告进…

基于java Springboot高校失物招领平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

[C++] 智能指针

文章目录 智能指针的使用原因及场景分析为什么需要智能指针&#xff1f;异常抛出导致的资源泄漏问题分析 智能指针与RAIIC常用智能指针 使用智能指针优化代码优化后的代码优化点分析 析构函数中的异常问题解决方法 RAII 和智能指针的设计思路详解什么是 RAII&#xff1f;RAII 的…

Git回到某个分支的某次提交

1.切换到需要操作的分支&#xff08;<branch-name>是分支名称&#xff09;。 命令如下&#xff1a; git checkout <branch-name> 2.获取代码的提交记录 。命令如下&#xff1a; git log 按q退出当前命令对话。 获取到某次提交或者合并的hash值&#xff08;下文…

掌握 Spring Boot 的最佳方法 – 学习路线图

在企业界&#xff0c;人们说“Java 永垂不朽&#xff01;”。但为什么呢&#xff1f;Java 仍然是开发企业应用程序的主要平台之一。大型公司使用企业应用程序来赚钱。这些应用程序具有高可靠性要求和庞大的代码库。根据Java开发人员生产力报告&#xff0c;62% 的受访开发人员使…

1. Django中的URL调度器 (项目创建与简单测试)

1. 创建 Django 项目 运行以下命令创建一个名为 blog_project 的 Django 项目&#xff1a; django-admin startproject blog_project2. 创建博客应用 Django 中&#xff0c;项目可以包含多个应用。创建一个名为 blog 的应用&#xff1a; cd blog_project python manage.py …

frp内网穿透介绍安装教程

文章目录 前言一、安装二、测试使用总结 前言 内网穿透&#xff08;Port Forwarding&#xff09;是将公网上的IP地址映射到内部网络中的一台计算机的某个端口上&#xff0c;以便外部网络可以访问该计算机中运行的应用程序。内网穿透技术可以通过一些开源工具来实现&#xff0c…

主界面获取个人信息客户端方

主界面获取个人信息客户端方 前言 上一集我们完成了websocket身份验证的内容&#xff0c;那么这一集开始我们将要配合MockServer来完成主界面获取个人信息的内容。 需求分析 我们这边是完成客户端那方的内容&#xff0c;当客户端登录成功之后&#xff0c;我们就要从服务器获…

redis实现消息队列的几种方式

一、了解 众所周知&#xff0c;redis是我们日常开发过程中使用最多的非关系型数据库&#xff0c;也是消息中间件。实际上除了常用的rabbitmq、rocketmq、kafka消息队列&#xff08;大家自己下去研究吧~模式都是通用的&#xff09;&#xff0c;我们也能使用redis实现消息队列。…

单片机智能家居火灾环境安全检测

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 在现代社会&#xff0c;火灾安全始终是人们关注的重点问题。随着科技的不…

【目标检测】用YOLOv8-Segment训练语义分割数据集(保姆级教学)

前言 这篇教程会手把手带你用 YOLOv8-Segment 搭建一个属于自己的分割任务项目。从环境配置到数据集准备&#xff0c;再到模型训练和测试&#xff0c;所有步骤都有详细说明&#xff0c;适合初学者使用。你将学会如何安装必要的软件&#xff0c;标注自己的数据&#xff0c;并使…

mac2019环境 Airflow+hive+spark+hadoop本地环境安装

1 环境介绍 本地安装可分为两个部分&#xff0c;mac软件环境&#xff0c; python开发环境 ps: 安装过程参考chatgpt、csdn文章 1.1 mac软件环境 目标安装的的软件是hive、apache-spark、hadoop&#xff0c;但是这三个软件又依赖java(spark依赖&#xff09;、ssh&#xff08…

1.7 JS性能优化

从输入url到页面加载完成都做了些什么 输入 URL - 资源定位符 http://www.zhaowa.com - http 协议 域名解析 https://www.zhaowa.com > ip 1. 切HOST&#xff1f; > 浏览器缓存映射、系统、路由、运营商、根服务器 2. 实际的静态文件存放&#xff1f; 大流量 > 多个…

【Ansible常用命令+模块+Playbook+Roles】

Ansible 一、命令1.1 常用命令 二、模块2.1 shell模块2.2 复制模块2.3 用户模块2.4 软件包管理2.5 服务模块2.6 文件模块2.7 收集模块2.8 fetch2.9 cron2.10 group2.11 script2.12 unarchive 三、YAML Roles3.1 目录结构3.2 文件内容tasks/main.yamlnginx.conf.j2vars/main.yam…