数据结构与算法之数组: LeetCode 605. 种花问题 (Ts, Py, Go版)

利用makehumancommunity导入人体模型到COMSOL里(需要solidwork) #makehumancommunity #solidwork #COMSOL 阅读详情

种花问题

  • https://leetcode.cn/problems/can-place-flowers/

描述

  • 假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。

  • 给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false 。

示例 1:

输入:flowerbed = [1,0,0,0,1], n = 1
输出:true

示例 2:

输入:flowerbed = [1,0,0,0,1], n = 2
输出:false

提示:

  • 1 <= flowerbed.length <= 2 * 10410^4104
  • flowerbed[i] 为 0 或 1
  • flowerbed 中不存在相邻的两朵花
  • 0 <= n <= flowerbed.length

Typescript 版算法实现

1 )方案1:简单遍历

// 判断是否能在花坛中种植指定数量的花
function canPlaceFlowers(flowerbed: number[], n: number): boolean {
    let cnt = 0; // 计数已经种植的花的数量
    const m = flowerbed.length; // 花坛数组的长度

    for (let i = 0; i < m; i++) {
        // 当前位置左侧是否为空地
        const isLeftEmpty = i === 0 || flowerbed[i - 1] === 0;
        // 当前位置是否为空地
        const isCurrentEmpty = flowerbed[i] === 0;
        // 当前位置右侧是否为空地
        const isRightEmpty = i === m - 1 || flowerbed[i + 1] === 0;

        // 如果左侧、当前位置、右侧均为空地,则可以在当前位置种花
        if (isLeftEmpty && isCurrentEmpty && isRightEmpty) {
            flowerbed[i] = 1; // 在当前位置种花
            cnt++; // 更新已经种植的花的数量
        }
    }

    // 判断是否可以完成种植
    return cnt >= n;
}
  • 主要思路是判断在给定的花坛状态中是否能够种植指定数量的花,满足以下条件:
    • 在花坛中的每个位置,如果其左侧相邻位置和右侧相邻位置都是 0,表示该位置可以种花。
    • 遍历花坛数组,检查每个位置是否满足上述条件,如果满足,则种植花,并累计已经种植的花的数量。
    • 最后,比较已经种植的花的数量与目标数量,确定是否可以完成种植。
  • 具体实现步骤:
    • 遍历花坛数组中的每个位置。
    • 对于每个位置,检查其左侧相邻位置和右侧相邻位置的状态,确定是否可以在当前位置种植花。
    • 如果可以种植花,则将当前位置标记为已经种植,并将已经种植的花的数量加一。
    • 遍历完整个花坛后,比较已经种植的花的数量与目标数量,确定是否可以完成种植。

2 )方案 2:基于规则的逐步判断

function canPlaceFlowers(flowerbed: number[], n: number): boolean {
    // 计数
    let count = 0
    // 在这里对数组进行扩展来方便编程,最后一块地能不能种只取决于前面的是不是1,所以默认最后一块地的右侧是0
    flowerbed.push(0)
    for (let i = 0, len = flowerbed.length - 1; i < len; i++) {
        // 当前是非零的情况,直接跳过
        if (flowerbed[i] !== 0) {
            continue
        }
        // 开始边界的处理
        if (i === 0 && flowerbed[1] === 0) {
            count++
            i++
        } else if (flowerbed[i - 1] === 0 && flowerbed[i + 1] === 0) {
            // 这种情况是正常情况,当前左右都是0,则可种树
            count++
            i++
        }
        // 结束边界无需处理,因为数组在最后扩展了一个0,上述正常情况已经包含了 无 
    }
    return count >= n
}
  • 哪些情况下可以种花,简化模型
  • 这里的地就是指 1或0,1是一块地,0也是一块地
  • 我们需要放1,能放1的地方是左边和右边都是0,并且当前位置是0
  • 匹配完成后,我们要主动跳过当前匹配,也就是跳2个位置
    • 体现在手动 i++以及for循环一次后自带的一个i++

3 )方案3:基于规则的逐步判断 + 滑动窗口

// 判断是否能在花坛中种植指定数量的花
function canPlaceFlowers(flowerbed: number[], n: number): boolean {
    // 左边界,初始为虚拟节点
    let l = -1;
    // 右边界
    let r = 0;
    // 遍历花坛数组
    while (r <= flowerbed.length) {
        // 获取右边界的值,若超出范围则为虚拟节点值
        const rv = r === flowerbed.length ? 0 : flowerbed[r];
        // 右边界右移
        r++;
        // 如果右边界是已种植的花,则更新左边界为右边界
        if (rv === 1) {
            l = r;
        }
        // 如果两边界相隔3个位置,则可以在中间位置种植一朵花
        if (r - l === 3) {
            // 减去需要种植的花的数量
            n--;
            // 更新左边界为下一个位置
            l += 2;
        }
    }
    // 若需要种植的花的数量小于等于0,则表示可以完成种植
    return n <= 0;
}
  • 初始化边界

    • 将左边界 l 初始化为虚拟节点(-1),表示初始时还没有遇到任何已种植的花。
    • 将右边界 r 初始化为花坛数组的起始位置(0)。
  • 遍历花坛数组

    • 从左到右遍历花坛数组,确保在数组范围内。
  • 更新右边界和检查已种植的花

    • 获取右边界 r 的值 rv,如果超出花坛数组范围,则将其设为虚拟节点值 0。
    • 右边界 r 向右移动。
  • 更新左边界

    • 如果右边界的值 rv 是已种植的花(值为 1),则将左边界 l 更新为当前右边界 r。
  • 判断是否可以在中间位置种植花

    • 如果右边界与左边界相隔 3 个位置(r - l === 3),表示在这两朵已种植的花之间有足够的空地可以种植新花。
    • 将需要种植的花的数量 n 减一。
    • 将左边界 l 更新为下一个位置(l += 2),以继续检查下一个区间。
  • 判断是否完成种植

    • 当所有花坛遍历完毕后,检查剩余需要种植的花的数量 n 是否小于等于 0。
    • 如果小于等于 0,则表示可以完成种植,返回 true;否则,表示不能完成种植,返回 false。
  • 通过维护左右边界和逐步判断每两朵已种植的花之间的空地情况

  • 算法能够有效地判断是否能够在花坛中种植指定数量的花。

Python3 版算法实现

1 )方案1:简单遍历

class Solution:
    def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
        cnt = 0  # 计数已经种植的花的数量
        m = len(flowerbed)  # 花坛数组的长度

        for i in range(m):
            # 当前位置左侧是否为空地
            is_left_empty = i == 0 or flowerbed[i - 1] == 0
            # 当前位置是否为空地
            is_current_empty = flowerbed[i] == 0
            # 当前位置右侧是否为空地
            is_right_empty = i == m - 1 or flowerbed[i + 1] == 0

            # 如果左侧、当前位置、右侧均为空地,则可以在当前位置种花
            if is_left_empty and is_current_empty and is_right_empty:
                flowerbed[i] = 1  # 在当前位置种花
                cnt += 1  # 更新已经种植的花的数量

        # 判断是否可以完成种植
        return cnt >= n

2 )方案 2:基于规则的逐步判断

class Solution:
    def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
        # 计数
        count = 0
        # 在这里对数组进行扩展来方便编程,最后一块地能不能种只取决于前面的是不是1,所以默认最后一块地的右侧是0
        flowerbed.append(0)
        i = 0
        while i < len(flowerbed) - 1:
            # 当前是非零的情况,直接跳过
            if flowerbed[i] != 0:
                i += 1
                continue
            # 开始边界的处理
            if i == 0 and flowerbed[1] == 0:
                count += 1
                i += 1
            elif flowerbed[i - 1] == 0 and flowerbed[i + 1] == 0:
                # 这种情况是正常情况,当前左右都是0,则可种树
                count += 1
                i += 1
            # 结束边界无需处理,因为数组在最后扩展了一个0,上述正常情况已经包含了
            i += 1
        return count >= n

3 )方案3:基于规则的逐步判断 + 滑动窗口

class Solution:
    def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
        # 左边界,初始为虚拟节点
        l = -1
        # 右边界
        r = 0
        # 遍历花坛数组
        while r <= len(flowerbed):
            # 获取右边界的值,若超出范围则为虚拟节点值
            rv = flowerbed[r] if r < len(flowerbed) else 0
            # 右边界右移
            r += 1
            # 如果右边界是已种植的花,则更新左边界为右边界
            if rv == 1:
                l = r
            # 如果两边界相隔3个位置,则可以在中间位置种植一朵花
            if r - l == 3:
                # 减去需要种植的花的数量
                n -= 1
                # 更新左边界为下一个位置
                l += 2
        # 若需要种植的花的数量小于等于0,则表示可以完成种植
        return n <= 0

Golang 版算法实现

1 )方案1:简单遍历

func canPlaceFlowers(flowerbed []int, n int) bool {
	cnt := 0
	m := len(flowerbed)

	for i := 0; i < m; i++ {
		// 当前位置左侧是否为空地
		isLeftEmpty := i == 0 || flowerbed[i-1] == 0
		// 当前位置是否为空地
		isCurrentEmpty := flowerbed[i] == 0
		// 当前位置右侧是否为空地
		isRightEmpty := i == m-1 || flowerbed[i+1] == 0

		// 如果左侧、当前位置、右侧均为空地,则可以在当前位置种花
		if isLeftEmpty && isCurrentEmpty && isRightEmpty {
			flowerbed[i] = 1
			cnt++
		}
	}

	// 判断是否可以完成种植
	return cnt >= n
}

2 )方案 2:基于规则的逐步判断

func canPlaceFlowers(flowerbed []int, n int) bool {
    // 计数
    count := 0
    // 在这里对数组进行扩展来方便编程,最后一块地能不能种只取决于前面的是不是1,所以默认最后一块地的右侧是0
    flowerbed = append(flowerbed, 0)
    i := 0
    for i < len(flowerbed)-1 {
        // 当前是非零的情况,直接跳过
        if flowerbed[i] != 0 {
            i++
            continue
        }
        // 开始边界的处理
        if i == 0 && flowerbed[1] == 0 {
            count++
            i += 2 // 修改这里的索引增量为2
        } else if i > 0 && flowerbed[i-1] == 0 && flowerbed[i+1] == 0 { // 修改这里的条件,确保索引不为负数
            // 这种情况是正常情况,当前左右都是0,则可种树
            count++
            i += 2 // 修改这里的索引增量为2
        } else {
            i++
        }
        // 结束边界无需处理,因为数组在最后扩展了一个0,上述正常情况已经包含了
    }
    return count >= n
}

3 )方案3:基于规则的逐步判断 + 滑动窗口

// 判断是否能在花坛中种植指定数量的花
func canPlaceFlowers(flowerbed []int, n int) bool {
    // 左边界,初始为虚拟节点
    l := -1
    // 右边界
    r := 0
    // 遍历花坛数组
    for r <= len(flowerbed) {
        // 获取右边界的值,若超出范围则为虚拟节点值
        var rv int
        if r == len(flowerbed) {
            rv = 0
        } else {
            rv = flowerbed[r]
        }
        // 右边界右移
        r++
        // 如果右边界是已种植的花,则更新左边界为右边界
        if rv == 1 {
            l = r
        }
        // 如果两边界相隔3个位置,则可以在中间位置种植一朵花
        if r-l == 3 {
            // 减去需要种植的花的数量
            n--
            // 更新左边界为下一个位置
            l += 2
        }
    }
    // 若需要种植的花的数量小于等于0,则表示可以完成种植
    return n <= 0
}
告别TI官网迷路!手把手教你用C2000Ware为TMS320F28027搭建Proteus仿真工程模板 本文详细指导如何使用C2000Ware为TMS320F28027搭建Proteus仿真工程模板,帮助DSP开发者快速上手。从资源获取、工程目录设计到关键文件配置,再到CCS与Proteus的联调技巧,全面解析仿真工程搭建的每个步骤,特别适合初学者和工程师参考。 阅读详情

相关推荐

神经网络基础概念总结(小白入门自用)

神经网络人工神经网络多层感知机激活函数反向传播算法损失函数权值初始化正则化方法 人工神经网络 人工神经元:人工神经元是人工神经网络的基本单元。模拟生物神经元,人工神经元有1个或者多个输入(模拟多个树突或者多个神经元向该神经元传递神经冲动);对输入进行加权求和(模拟细胞体将神经信号进行积累和树突强度不同);对输入之和使用激活函数计算活性值(模拟细胞体产生兴奋或者抑制);输出活性值并传递到下一个人工神经元(模拟生物神经元通过轴突将神经冲动输入到下一个神经元)。 人工神经网络:大量的人工神经元以某种链接方式得来的

qq_42011158的博客 650

【leetcode之旅】 数组 - 605.种花问题

假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。 给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花?能则返回True,不能则返回False。 示例 1: 输入: flowerbed = [1,0,0,0,1], n = 1 输出...

Evan_QB的博客 394

Windows本地部署Ollama+qwen本地大语言模型Web交互界面并实现公网访问

本文主要介绍如何在Windows系统快速部署Ollama开源大语言模型运行工具,并安装Open WebUI结合cpolar内网穿透软件,实现在公网环境也能访问你在本地内网搭建的大语言模型运行环境。近些年来随着ChatGPT的兴起,大语言模型 LLM(Large Language Model)也成为了人工智能AI领域的热门话题,很多大厂也都推出了自己的大语言模型,并或多或少的开源了自己的大语言模型,今天就来分享一个最近很火,且对于小白来说比较好上手本地部署的运行本地LLM的工具Ollama。

迪之的博客 1652

数据结构与算法笔记:字典序最大问题分析

字典序最大问题 问题描述 给定一个1到n的排列(无序状态的),依次插入到栈中,在每时每刻都可以多次从栈中弹出栈顶 问:应如何使得弹出栈顶的序列的字典序最大,并输出这个序列 问题分析 什么是字典序 比如两个序列:5,4,3,2,1和1,2,3,4,5 这两个中第一个的字典序最大 每个位置上的数字比其他序列上同一位置的数字要大 比如:第一位置中5比1大,第二位置中4比2大这样 即:字典序最大 = 从左向右看这个序列,每个数字都尽量大 题目给定一个1到n的排列,每个数字只出现一次 要使出栈的字典序最大

Wang的专栏 4393

Kafka 系列 —(17)Kafka 流式处理:Kafka Streams架构、使用场景、框架选择

本文介绍了KafkaStreams的架构特点、应用场景及与其他流处理框架的比较。KafkaStreams作为嵌入式分布式流处理库,其核心架构包含流处理器、任务、拓扑和本地状态存储,具备自动容错和伸缩能力。适用于实时监控、ETL、聚合、Join、物化视图等低延迟场景。与Flink、Spark相比,KafkaStreams适合简单架构和微服务,而Flink适合大规模处理,Spark更适合批处理。选择框架需根据具体场景需求,如微服务推荐KafkaStreams,大规模处理推荐Flink。

moton2017的博客 1631

Basilisk vs. STK:开源航天仿真工具在Windows上的实战体验与生态对比

本文对比了开源航天仿真工具Basilisk与商业软件STK在Windows平台上的实战体验与生态差异。从技术架构、安装配置、使用成本、功能覆盖、社区生态到适用场景,全面分析了二者的优劣势,为航天工程师和研究人员提供选型参考。Basilisk在性能和扩展性上表现突出,而STK在可视化与专业模块上更具优势。

weixin_30632089的博客 589

数据结构与算法笔记:农夫过河问题python3实现

问题描述 农夫(Human)过河。一个农夫带着一只狼(Wolf),一只羊(Sheep)和一些菜(Vegetable)过河。河边只有一条船,由于船太小,只能装下农夫和他的一样东西。在无人看管的情况下,狼要吃羊,羊要吃菜,请问农夫如何才能使三样东西平安过河? 要求: 输出一行,为最终的过河方式,方案格式为 过河人员、回来人员、过河人员、回来人员、…、过河人员。 过去和回来的人员之间,用空格隔开。 以四...

Wang的专栏 3374

【uniapp踩坑记】App Store上传失败:Invalid Swift Support错误怎么解决?

作为一个前端出身的开发者,用 uniapp 开发原生 App 已经够挑战了,打包 iOS 上传 App Store 更是处处暗雷。这次的坑虽然小,但确实容易忽略。如果你也遇到了类似的报错,希望这篇文章能帮你少踩一次坑!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1143

数据结构与算法笔记:计算思维之经典农夫过河问题C++实现

农夫、羊、狼、菜的过河问题 问题描述 角色:农夫,羊,狼,菜 条件1:船很小,只能装下农夫和其他一个角色 条件2:无人看管,羊吃菜,狼吃羊 问:如何让其他三种角色被农夫平安带着过河? 相关分析 我们可以先用人脑尝试一下相关渡河策略 1 ) 先渡狼,人回来再渡菜,人回来再渡羊 2 ) 先渡菜,人回来再渡狼,人回来再渡羊 以上两种很好想到,而且我们可以知道羊这种角色是不能先渡河过去的,羊需要最后再渡 如果先渡了羊了,之后再渡任何其他角色,都要将羊带回来 可以参考小游戏:http://gameschool

Wang的专栏 3312

【AI工具】Browser use搭建及使用的保姆级教程:让AI帮你自动操作浏览器

【AI工具】Browser use搭建及使用的保姆级教程:让AI帮你自动操作浏览器

funfan的博客 2537

【软考高级系统架构论文】论微服务架构及其应用

本文围绕“论微服务架构及其应用”展开论述。首先概要介绍了本人参与的某公司线上电子商务平台项目,在其中担任系统架构设计师。接着分析了微服务架构相较于单块架构的特点,如模块化与组件化、技术栈多样性、独立部署与扩展、高度容错与可用性等。最后结合项目阐述了软件架构对微服务模式的采用情况,以及实施过程中遇到的问题及解决方案,如服务划分粒度、数据一致性、监控与故障排查等问题,并给出了相应解决办法。

qq837993702的博客 226

数据结构与算法笔记:图搜索之DFS详解

图搜索 Graph Search 图搜索的分类 BFS广度优先(宽搜) DFS深度优先(深搜) !!!本文详解!!! 深度优先搜索DFS 深度优先遍历DFS, 这个策略其实是非常stupid or simple的,比BSF要简单的多 同样,我们可以通过一个故事来开始 在古希腊神话中, Ariadne是Crete的国王Minos的公主,她给忒修斯(Theseus)一个线团 使得忒修斯成功进入迷宫杀死牛头怪兽,但事后忒修斯抛弃了她 这是一个有道德意义的故事又或者存在不同的版本, 但不是我们的研究的对象

Wang的专栏 3119

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数据结构与算法笔记:计算思维之人鬼渡河问题

人鬼渡河问题 1 ) 问题描述 目标:将东岸的3人3鬼通过一只小船安全转移到西岸,希望摆渡次数尽可能少 条件 船的容量有限,一次最多只能坐2人(或2鬼或1人1鬼) 无论是在河的东岸还是在河的西岸,一旦鬼数多于人数,则人将被鬼吃掉 怎样渡河的大权掌握在人的手中 说明:划船的时间忽略不计。船一靠岸即将船与岸视为一体,人和鬼即使还没有下 船也视为已上岸 任务:编写程序,求出一种渡河方案 备注:图片托管于github,请确保网络的可访问性 2 ) 分析 目标是找

Wang的专栏 2447

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数据结构与算法之二叉树: LeetCode 701. 二叉搜索树中的插入操作 (Ts版)

1 ) 方案1:模拟。2 ) 方案2:递归。

Wang的专栏 2270

数据结构与算法笔记:计算思维之下楼梯台阶和象棋跳马问题

下台阶问题 1 ) 问题描述 从楼上走到楼下共有 h 个台阶,每一步有三种走法 走一个台阶; 走二个台阶; 走三个台阶。 问:一共可以走出多少种方案? 即共要多少步? 每一步走几级台阶? 2 ) 分析 初始思路 我们根据题目给定的场景,先简单模拟一下,设定 h=4h=4h=4 备注:图片托管于github,请确保网络的可访问性 如上图所示, 这里有4阶楼梯, 红色数字代表每一步走几级台阶 这里枚举了4层台阶的所有可能情况, 但是不管具体有几级台阶,下

Wang的专栏 2111

Python笔记:滑动验证码的识别算法

概述 用程序识别极验滑动验证码的验证,包括分析识别思路、识别缺口位置、生成滑块拖动路径、模拟实现滑块拼合通过验证等步骤。 准备工作 使用Python库是Selenium,浏览器为Chrome。请确保已安装Selenium库和ChromeDriver浏览器驱动。 关于极验滑动验证码: 极验滑动验证码官网为:http://www.geetest.com/ 验证方式为拖动滑块拼合图像,若图像完全拼合...

Wang的专栏 2103

数据结构与算法之堆: LeetCode 295. 数据流的中位数 (Ts版)

/ 返回 1.5 ((1 + 2) / 2)中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。3 ) 方案3:有序集合 + 双指针。2 ) 方案2:优先队列-优化版。1 ) 方案1:优先队列。

Wang的专栏 1907

数据结构与算法笔记:计算思维之谁做的好事与刑侦作案问题

谁做的好事 清华附中有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。 A说:不是我。 B说:是C。 C说:是D。 D说:他胡说。 已知:三个人说的是真话,一个人说的是假话。 现在请你根据这些信息,编写程序找出做了好事的人。 分析 将四个人说的四句话(自然语言)转换成计算机可以计算的式子, 可使用循环枚举的方式来判断 (1) 思路一:通过字符表示人 先定义一个字符变量 thisman 表示要寻找的做了好事的人的“名字(代号)”(A、B、C、D),即 char this

Wang的专栏 1829

数据结构与算法笔记:图搜索之BFS详解

图搜索 Graph Search 图搜索的分类 BFS广度优先(宽搜) DFS深度优先(深搜) 广度优先搜索BFS 我们可以用比喻来说明广度优先搜索算法 在一片草木枯黄的深秋草原上,在草原的某一处出现了一处野火 一开始的时候野火集中于一点之上,在这点野火耗尽当前植被变成灰烬之前点燃了周围的植被 比如节点s是初始火种,假设我们手中有一个秒表,每过1秒,我们的大火会向外迈进一步 这个过程只能向外,不能向内,因为只能点燃植被,不能把灰烬点燃 蓝色的点是即将变为灰烬的点,红色的点是刚被点燃的点,灰色的圆形或

Wang的专栏 1791

数据结构与算法之动态规划: LeetCode 1494. 并行课程 II (Ts版)

给你一个整数 n 表示某所大学里课程的数目,编号为 1 到 n ,数组 relations 中, relations[i] = [xi, yi] 表示一个先修课的关系,也就是课程 xi 必须在课程 yi 之前上。解释:上图展示了题目输入的图。一个最优方案是:第一学期上课程 2 和 3,第二学期上课程 4 ,第三学期上课程 1 ,第四学期上课程 5。然后第二个学期上课程 1 ,第三个学期上课程 4。在一个学期中,你 最多 可以同时上 k 门课,前提是这些课的先修课在之前的学期里已经上过了。

Wang的专栏 1749

数据结构与算法笔记:求直方图最大面积算法分析

直方图最大面积 问题描述 有n列的直方图,第j列高度为hjh_jhj​, 求一个面积最大的子矩阵 备注:图片托管于github,请确保网络的可访问性 格式要求 输入第一行正整数n,第二行n个空格隔开的非负整数 数据范围: 所有直方图的列不会超过30000 关键算法实现 1 ) 算法1:时间复杂度为: O(n3)O(n^3)O(n3)的实现 分析 矩形面积为底和高的乘积 底部从a到b,那么底边长为: b-a+1 高为:min{hi∣a≤i≤b}min \{h

Wang的专栏 1664

数据结构与算法之LRU: 实现 LRU 缓存算法功能 (Ts, Py, Go版)

LRU - Lease Recently Used 最近使用如果内存优先,只缓存最近使用的,删除 ‘沉睡’ 数据核心 api: get set分析。

Wang的专栏 1599

数据结构与算法之贪心: LeetCode 455. 分饼干 (Ts, Py, Go版)

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j]。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。2 )排序 + 双指针 + 贪心。1 )排序 + 遍历。

Wang的专栏 1566

动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100

将一个复杂问题拆分成多个规模更小的子问题,通过保存子问题的计算结果,避免重复计算,最终得到原问题的答案。先看一个经典问题。dp[i] = 以第 i 个元素结尾的最优结果例如最长递增子序列。最长递增子序列不一定以最后一个元素结尾,因此必须遍历整个数组取最大值。dp[i] = 前 i 个元素的最优结果这种情况下,最终答案通常就是dp[n]。关键在于理解 dp 数组的定义。动态规划的核心并不是背诵某个固定模板,而是建立正确的状态定义,并通过状态转移方程解决问题。dp[i] 或 dp[i][j] 表示什么?

zengjiajun2006的博客 876

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等) 题目描述: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: - s = s1 + s2 + ... + sn - t = t1 + t2 + ... + tm - |n - m| <= 1 - 交错 是 s1 + t

huayimenghan的博客 212

LeetCode 每日一题 2026/11/2-2026/11/8

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

AlphaTao的博客 186

Hash表:两数之和、字母异位词分组、最长连续序列 [力扣 Hot100]

三道高频哈希表应用题:两数之和(利用HashMap快速查找补数)、字母异位词分组(排序后作为键分组)、最长连续序列(通过HashSet去重并仅从序列起点扩展)。核心思想均为借助哈希结构优化查找效率,避免重复计算。同时提及双指针等其他解法思路,体现算法设计中“空间换时间”的典型策略。

2403_87560480的博客 226
上一篇: 数据结构与算法之数组: LeetCode 914. 卡牌分组 (Ts, Py, Go版)
下一篇: 数据结构与算法之数组: LeetCode 89. 格雷编码 (Ts, Py, Go版)
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值