数据结构与算法之数组: LeetCode 89. 格雷编码 (Ts, Py, Go版)

S参数反演法 等效介质理论模型— 利用S参数反演法提取超材料结构的等效参数 等效介质理论模型—利用S参数反演法提取超材料结构的等效参数 S参数反演法,即利用等效模型的传输矩阵和S参数求解超材料结构的等效折射率n和等效阻抗Z的过程。本文对等效介质理论模型进行了详细介绍,并提供对应代码。 超材料的传输矩阵 超材料结构的传输矩阵函数为: 其中,d 为等效光学活性材料的厚度,n 为折射率,Z 表示阻抗。 S参数和传输矩阵T 超材料结构的S参数和传输矩阵T满足下列方程: 利用以上两式,可以得到等效折射率n和相对阻抗的表达式 阅读详情

格雷编码

  • https://leetcode.cn/problems/gray-code/

描述

  • n 位格雷码序列 是一个由 2n2^n2n 个整数组成的序列,其中:
    • 每个整数都在范围 [0, 2n2^n2n - 1] 内(含 0 和 2n−12^n - 12n−1)
    • 第一个整数是 0
    • 一个整数在序列中出现 不超过一次
    • 每对 相邻 整数的二进制表示 恰好一位不同 ,且
    • 第一个 和 最后一个 整数的二进制表示 恰好一位不同
    • 给你一个整数 n ,返回任一有效的 n 位格雷码序列 。

示例 1:

输入:n = 2
输出:[0,1,3,2]
解释:
[0,1,3,2] 的二进制表示是 [00,01,11,10] 。
- 00 和 01 有一位不同
- 01 和 11 有一位不同
- 11 和 10 有一位不同
- 10 和 00 有一位不同
[0,2,3,1] 也是一个有效的格雷码序列,其二进制表示是 [00,10,11,01] 。
- 00 和 10 有一位不同
- 10 和 11 有一位不同
- 11 和 01 有一位不同
- 01 和 00 有一位不同

示例 2:

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

提示:

  • 1 <= n <= 16

Typescript 版算法实现

1 )方案 1:递归

function grayCode(n: number): number[] {
  // 递归函数,用来算输入为n的格雷编码序列
  const recursionFn = (n: number) => {
    if (n === 1) return ['0', '1']
    const prev: string[] = recursionFn(n - 1)
    const result: string[] = []
    const max: number = Math.pow(2, n) - 1 // 最大值
    // 生成新的数组
    for (let i = 0, len = prev.length; i < len; i++) {
	    result[i] = `0${prev[i]}` // 生成前i个,前一半
	    result[max - i] = `1${prev[i]}` // 生成后一半,和上面是对称的(倒序)
    }
    return result
  }
  return recursionFn(n).map(item => parseInt(item, 2)) // 这里二进制转十进制
}
  • 这里是基于演草纸上画出得到一个规律
  • 当n为1时
    • 二进制输出:[0,1],换成十进制输出是:[0,1]
    • 0 - 0
    • 1 - 1
    • 这里还看不出什么
  • 当n为2时
    • 二进制输出:[0,1,11,10],换成十进制就是 [0,1,3,2] 竖着看如下
    • 00 - 0
    • 01 - 1
    • 11 - 3
    • 10 - 2
    • 从上面看出,最终是偶数个总数,中间劈开一半各自对称
      • 比如:00 对应 11;01对应10
  • 当n为3时
    • 输出:[0,1,11,10,110,111,101,100],换成十进制是:[0,1,3,2,6,7,5,4],竖着排列
    • 000 - 0
    • 001 - 1
    • 011 - 3
    • 010 - 2
    • 110 - 6
    • 111 - 7
    • 101 - 5
    • 100 - 4
    • 从上述可以看到验证了上述规律
  • 这里输入的n和n-1有关,直到和最后的1有关,而1就是 [‘0’, ‘1’]的字符串
  • 这种方案属于归纳总结产生的,因为用到的是递归,容易爆栈,效率还不高

2 )方案 2:基于迭代的算法策略

function grayCode(n: number): number[] {
    // 初始化n为1位时的场景
    const result = [0, 1]
    // 对n位进行遍历
    for (let i = 1; i < n; i++) {
        const len = result.length
        // 倒序循环,内层循环一次完毕,会递增len的长度,也就是让result中的元素翻一倍
        for (let j = len - 1; j >= 0; j--) {
            // 进行左移操作,并加入当前的值
            result.push((1 << i) + result[j])
        }
    }
    return result
};
  • 这是官方示例,两个for循环,内部使用了左移操作
  • 这个算法很精妙,比方案1好很多,而且效率也较高
  • 这种算法策略利用了格雷编码的特性
    • 相邻两个格雷码之间只有一位二进制位不同
    • 通过对当前已有的格雷编码序列进行左移操作
    • 并在前面加上新的二进制位(0 或 1), 可以得到新的格雷编码序列
    • 而通过在内层循环中倒序遍历已有的格雷编码序列
    • 并在每个元素前加上左移操作得到的新值
    • 可以保证生成的新格雷编码序列满足相邻两个格雷码之间只有一位不同的条件

3 )方案3:利用已有的格雷编码来生成新的格雷编码

function grayCode(n: number): number[] {
    // 初始化结果数组,初始值为 0
    const ret: number[] = [0];
    // 遍历生成长度为 n 的格雷编码序列
    for (let i = 1; i <= n; i++) {
        // 获取当前结果数组的长度
        const m = ret.length;
        // 从后往前遍历已有的格雷编码序列
        for (let j = m - 1; j >= 0; j--) {
            // 在已有的格雷编码基础上进行位运算,生成新的格雷编码,并添加到结果数组中
            ret.push(ret[j] | (1 << (i - 1)));
        }
    }
    return ret; // 返回生成的格雷编码序列数组
};
  • 初始化结果数组:首先,创建一个数组 ret,并将初始值 0 放入其中。这是因为格雷编码序列的起始值总是 0
  • 遍历生成格雷编码序列:使用一个循环来生成长度为 n 的格雷编码序列。从 1 开始遍历,直到 n
  • 遍历已有的格雷编码:在每次迭代中,通过遍历已有的格雷编码来生成新的格雷编码
  • 从已有的格雷编码数组的最后一个元素开始,向前遍历直到第一个元素
  • 位运算生成新的格雷编码:在内部循环中,对已有的格雷编码进行位运算来生成新的格雷编码
  • 具体来说,通过按位或运算将 1 左移 (i - 1) 位后,与已有的格雷编码进行按位或操作,生成新的格雷编码
  • 将新的格雷编码添加到结果数组:将生成的新格雷编码添加到结果数组中
  • 返回结果数组:最后,返回生成的格雷编码序列数组 ret

4 )方案4:位运算策略来生成格雷编码序列

function grayCode(n: number): number[] {
    // 初始化结果数组
    const ret: number[] = [];

    // 遍历生成格雷编码序列
    for (let i = 0; i < 1 << n; i++) {
        // 根据格雷编码生成规则,将当前数值添加到结果数组中
        ret.push((i >> 1) ^ i);
    }

    return ret; // 返回生成的格雷编码序列数组
}
  • 遍历所有可能的格雷编码

    • 通过循环遍历 0 到 2^n - 1 的所有数值,其中 n 是格雷编码序列的长度
    • 这保证了所有可能的格雷编码都被生成
  • 位运算生成格雷编码:对于每个数值 i,通过位运算生成相应的格雷编码 grayCode(i) = (i >> 1) ^ i

    • 这里 >> 是右移位操作,^ 是异或操作
    • 这个公式的实现效果是将当前数值右移一位,然后与原始数值进行异或操作,从而生成对应的格雷编码
  • 添加到结果数组:将生成的格雷编码依次添加到结果数组中

Python3 版算法实现

1 )方案 1:递归

import math

class Solution:
    def grayCode(self, n: int) -> List[int]:
        # 递归函数,用来算输入为n的格雷编码序列
        def recursionFn(n):
            if n == 1:
                return ["0", "1"]  # 基本情况:n=1时,返回初始的格雷编码序列
            # 递归调用,获取前一级别的格雷编码序列
            prev = recursionFn(n - 1)
            # 结果数组长度为前一级别格雷编码序列长度的两倍
            result = [None] * (2 * len(prev))
            # 最大值,即格雷编码的最后一个值
            max_val = int(math.pow(2, n)) - 1
            # 遍历前一级别格雷编码序列
            for i in range(len(prev)):
                # 生成前一半的格雷编码序列,每个值在前面加上 0
                result[i] = "0" + prev[i]
                # 生成后一半的格雷编码序列,每个值在前面加上 1,且位置与前一半对称
                result[max_val - i] = "1" + prev[i]
            return result

        # 调用递归函数计算格雷编码序列
        result = recursionFn(n)
        # 返回最终结果数组
        return [int(item, 2) for item in result]

2 )方案 2:基于迭代的算法策略

class Solution:
    def grayCode(self, n: int) -> List[int]:
        # 初始化n为1位时的场景
        result = [0, 1]
        # 对n位进行遍历
        for i in range(1, n):
            length = len(result)
            # 倒序循环,内层循环一次完毕,会递增length的长度,也就是让result中的元素翻一倍
            for j in range(length - 1, -1, -1):
                # 进行左移操作,并加入当前的值
                result.append((1 << i) + result[j])
        return result

3 )方案 3:利用已有的格雷编码来生成新的格雷编码

class Solution:
    def grayCode(self, n: int) -> List[int]:
        # 初始化结果数组,初始值为 0
        ret = [0]
        # 遍历生成长度为 n 的格雷编码序列
        for i in range(1, n + 1):
            # 获取当前结果数组的长度
            m = len(ret)
            # 从后往前遍历已有的格雷编码序列
            for j in range(m - 1, -1, -1):
                # 在已有的格雷编码基础上进行位运算,生成新的格雷编码,并添加到结果数组中
                ret.append(ret[j] | (1 << (i - 1)))
        return ret  # 返回生成的格雷编码序列数组

4 )方案 4:位运算策略来生成格雷编码序列

class Solution:
    def grayCode(self, n: int) -> List[int]:
        # 初始化结果数组
        ret = []

        # 遍历生成格雷编码序列
        for i in range(1 << n):
            # 根据格雷编码生成规则,将当前数值添加到结果数组中
            ret.append((i >> 1) ^ i)

        return ret  # 返回生成的格雷编码序列数组

Golang 版算法实现

1 )方案 1:递归

import "math"

func grayCode(n int) []int {
	// 递归函数,用来算输入为n的格雷编码序列
	var recursionFn func(int) []string
	// 定义递归函数
	recursionFn = func(n int) []string {
		if n == 1 {
			return []string{"0", "1"} // 基本情况:n=1时,返回初始的格雷编码序列
		}
		// 递归调用,获取前一级别的格雷编码序列
		prev := recursionFn(n - 1)
		// 结果数组长度为前一级别格雷编码序列长度的两倍
		result := make([]string, 2*len(prev))
		// 最大值,即格雷编码的最后一个值
		max := int(math.Pow(2, float64(n))) - 1
		// 遍历前一级别格雷编码序列
		for i := 0; i < len(prev); i++ {
			// 生成前一半的格雷编码序列,每个值在前面加上 0
			result[i] = "0" + prev[i]
			// 生成后一半的格雷编码序列,每个值在前面加上 1,且位置与前一半对称
			result[max-i] = "1" + prev[i]
		}
		return result
	}
	// 调用递归函数计算格雷编码序列
	result := recursionFn(n)
	// 初始化最终结果数组
	finalResult := make([]int, len(result))
	// 遍历计算得到的格雷编码序列
	for i, item := range result {
		// 初始化十进制值
		val := 0
		// 遍历格雷编码的每一位
		for _, ch := range item {
			// 根据格雷编码规则计算对应的十进制值
			val = val*2 + int(ch-'0')
		}
		// 将计算得到的十进制值存入最终结果数组
		finalResult[i] = val
	}
	// 返回最终结果数组
	return finalResult
}

2 )方案 2:基于迭代的算法策略

func grayCode(n int) []int {
	// 初始化n为1位时的场景
	result := []int{0, 1}
	// 对n位进行遍历
	for i := 1; i < n; i++ {
		length := len(result)
		// 倒序循环,内层循环一次完毕,会递增length的长度,也就是让result中的元素翻一倍
		for j := length - 1; j >= 0; j-- {
			// 进行左移操作,并加入当前的值
			result = append(result, (1<<i)+result[j])
		}
	}
	return result
}

3 )方案 3:利用已有的格雷编码来生成新的格雷编码

func grayCode(n int) []int {
    // 初始化结果数组,初始值为 0
    ret := []int{0}
    // 遍历生成长度为 n 的格雷编码序列
    for i := 1; i <= n; i++ {
        // 获取当前结果数组的长度
        m := len(ret)
        // 从后往前遍历已有的格雷编码序列
        for j := m - 1; j >= 0; j-- {
            // 在已有的格雷编码基础上进行位运算,生成新的格雷编码,并添加到结果数组中
            ret = append(ret, ret[j]|(1<<(i-1)))
        }
    }
    return ret // 返回生成的格雷编码序列数组
}

4 )方案 4:位运算策略来生成格雷编码序列

func grayCode(n int) []int {
    // 初始化结果数组
    ret := make([]int, 0)

    // 遍历生成格雷编码序列
    for i := 0; i < 1<<uint(n); i++ {
        // 根据格雷编码生成规则,将当前数值添加到结果数组中
        ret = append(ret, i>>1^i)
    }

    return ret // 返回生成的格雷编码序列数组
}
多无人车协同探索开源包部署教程及常见报错解决方式 本博客将介绍项目的基本概念、部署步骤以及常见问题的解决方案。该项目利用 RRT(Rapidly-exploring Random Tree)算法,通过多机器人协作进行高效的环境探索,适用于自动化与自主导航任务。项目简介:介绍该项目的核心算法、特点及应用场景,展示如何通过多个机器人共同工作来提升探索效率。部署教程:详细讲解如何在 ROS Noetic 环境中部署该项目,安装依赖、创建工作空间、克隆代码并编译项目。项目运行:包括单机器人与多机器人自主探索的示例,帮助读者快速理解和实践项目。 阅读详情

相关推荐

Qt开发实战:QWebEngineView缓存路径详解与自定义配置(Windows/Linux)

本文详细解析了Qt框架中QWebEngineView组件的缓存机制,提供了Windows和Linux系统下的默认缓存路径及自定义配置方案。通过实战代码示例,展示了如何实现跨平台缓存路径管理、权限设置以及企业级应用中的多用户隔离策略,帮助开发者有效管理Web内容缓存,提升应用性能和数据安全性。

weixin_42519826的博客 404

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

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

Wang的专栏 4393

从零到一:手把手教你用Verilog在FPGA上构建自己的FFT处理器(不依赖IP核)

本文详细介绍了如何从零开始使用Verilog在FPGA上构建256点FFT处理器,不依赖商业IP核。内容涵盖FFT算法基础、蝶形运算单元设计、整体架构实现、时序收敛优化策略以及测试验证方法,重点提升FPGA上算法部署的运行效率与资源利用率。

vv45678的博客 823

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

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

Wang的专栏 3374

条码打印工具-Bartender的使用

文章目录1、安装Bartender1.解压安装包,可获得bartender2021版本和破解文本2. 双击“BarTender_2021_R1_Full_x64.exe”文件运行,勾选协议及软件安装设置3. 选择安装选项,自行选择勾选,点击Browser可更换软件安装路径4. 耐心等待软件安装完成,直接点击完成退出5. 此时会弹出提示需要激活许可证,先点击取消6. 接着将Crack夹中的“BarTend.exe”破解文件复制到软件安装目录中替换7. 再双击“serial.reg”导入注册,点击确定即可8.

暮紫的笔记本 1万+

JavaScript China城市联动

中国全城市的地址省,市,县 <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title></title> <script src="jquery.js"></script> <script src="json.js"></...

唯唯同学 2241

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

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

Wang的专栏 3312

STC8H开发(十六): GPIO模拟SPI驱动Ci24R1实现低成本无线遥控

本文详细介绍了如何使用STC8H单片机通过GPIO模拟SPI驱动Ci24R1无线模块,实现低成本无线遥控方案。内容涵盖硬件设计要点、软件驱动开发技巧及实战优化经验,特别适合消费电子产品开发者参考。Ci24R1凭借其高性价比和双模协议支持,成为替代传统nRF24L01+的理想选择。

weixin_30378623的博客 352

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

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

Wang的专栏 3119

精度0.01%决定续航多20km|新能源汽车研发测试:功率分析仪到底有多硬核?

新能源汽车测试、功率分析仪、电驱系统、效率MAP、谐波THD、GB/T18488、CLTC工况、三电测试、台架标定、能量流分析。中的核心作用,用公式、思维导图、实战金句与避坑指南,帮研发测试人员把准数据、提效率、降返工,看完就能落地用。点击关注,进公众号主页查看历史文章,**台架接线图、效率MAP模板、GB/T18488测试清单等。优化弱磁/调制策略,高效区占比提升5%,CLTC续航直接+8~20km。同样工况,两次数据差0.8%,报告根本没法交。结果:数据飘、定位慢、反复返工、认证不过。

优快云-新能源汽车研发测试专业博主 173

PrimeTime low power-多电压设计流程(2)

get_power_switches`、`get_supply_nets` 和 `get_supply_ports` 命令的操作方式类似,并具有类似的命令选项。PrimeTime 根据 UPF 命令构建电源供应网络,包括 create_power_domain、create_supply_net、create_supply_set、create_supply_port、set_domain_supply_net 和 connect_supply_net。电源集句柄是为电源域隐式创建的一个抽象电源集。

QRBQ 712

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

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

Wang的专栏 2447

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

Wang的专栏 2270

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

Wang的专栏 2111

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 346

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 332

把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

长上下文推理卡在KV Cache的显存与带宽上,而现有FP4方案要么精度崩、要么速度废。这篇文章复盘BitDecoding-FP4如何用三个算法补丁加一个系统重构,在B300上把服务吞吐提升2.4–3.0倍,精度几乎不掉。

helloagent的博客 312

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 606
上一篇: 数据结构与算法之数组: LeetCode 605. 种花问题 (Ts, Py, Go版)
下一篇: 数据结构与算法之队列: LeetCode 933. 最近的请求次数 (Ts, Py, Go版)
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值