算法设计与分析(六)

基于MATLAB步态算法仿真的六足仿生机器人 一、概述 1.研究意义   随着人类对在复杂环境中既具备高移动能力,又具备可靠性,且易于扩展的移动平台日益迫切的需求,步行机器人作为一种拥有全方位移动能力的移动运载平台,具有非常广阔的应用前景。从仿生学角度来讲,多足机器人分为仿人、仿四足哺乳动物、仿昆虫行走机器人。在众多步行机器人中,模仿昆虫以及其他节肢动物的肢体结构和运动控制策略而创造出的六足机器人具有代表性。   一般来说,仿人机器人重... 阅读详情

779. K-th Symbol in Grammar

On the first row, we write a 0. Now in every subsequent row, we look at the previous row and replace each occurrence of 0 with 01, and each occurrence of 1 with 10.

Given row N and index K, return the K-th indexed symbol in row N. (The values of K are 1-indexed.) (1 indexed).
Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

Example

Examples:
Input: N = 1, K = 1
Output: 0

Input: N = 2, K = 1
Output: 0

Input: N = 2, K = 2
Output: 1

Input: N = 4, K = 5
Output: 1

Explanation:
row 1: 0
row 2: 01
row 3: 0110
row 4: 01101001

Note

  1. N will be an integer in the range [1, 30].
  2. K will be an integer in the range [1, 2^(N-1)].

思路

因为这周还是在讲习题课,没有讲新的内容,所以我就去找了道递归的题目练习一下。通常递归相关的题目代码量都不是非常大,难点再于递归函数的编写,个人总结了一下就是要弄清楚下一层递归的条件,以及最底层的返回。

对于这道题,以N = 4为例,可以把前4层构造成一棵二叉树:
1

题目的意思很容易理解,就是让我们把最下层叶子结点编号,输出第K个结点的数字:
2
所以递归函数的底层返回条件就很明显了,当搜索到叶子结点的时候把叶子结点的值返回。我们可以把查找目标叶子结点的过程描述为从根节点出发,到目标叶子结点的路径。
例如如果我们要找K = 4的结点,那就是一条从根节点出发的左右右路径,所以先把各个结点的路径写出来:
3
因为左结点值就是父节点的值,右结点的值是父结点的值取反,所以我们的函数只需要记录当前一个父结点的值就行,不需要把整棵树存下来。现在的问题就变成了我们什么时候要往左,什么时候要往右(做到这里的时候我发现了一种非递归的解法,下面我会讲到)。

如果目标结点在左子树,我们下一层的递归就是左子树,把右子树全部舍弃,如果目标结点在右字数就做相反的处理。判断目标结点在左子树还是右子树的条件如下:

初始化:
rank = 最底层叶子结点数(对于N = 4 的题目,rank = 8)
如果K <= rank / 2,那么目标结点在左子树,根节点变为左结点
如果K > rank / 2,那么目标结点在右子树,根节点变为右结点
每一次递归都让rank = rank /2,重复上面过程,直到rank == 1
**注:**在实际写代码时,对于目标结点在右子树的情况,要做一步K -= rank / 2的操作。因为rank的值在不断减小,K的值也必须相应地变化。

在N = 4情况下寻找K =4叶子结点的过程:
2
4
5
6

代码

class Solution {
public:
    int kthGrammar(int N, int K) 
    {
      int rank = 1;
      for (int i = 0; i < N; i++)
        rank *= 2;
      return recursion(0, rank, K);
    }

    int recursion(int num,int rank, int index)
    {
      if (rank == 1) return num;	//递归到底层
      if (index <= rank / 2) return recursion(num, rank / 2, index);	//递归左子树
      else return recursion((num + 1) % 2, rank / 2, index - rank / 2);	//递归右子树
    }
};

非递归解法

在给N = 4的二叉树写路径的时候,偶然间发现了这道题的非递归解法,如果把往左的操作编码为0,往右的操作编码为1,我们的二叉树就会变成这样:
7
叶子结点的编码其实就是K - 1的二进制值!以前上离散数学的课学习二叉树时貌似有讲过二叉树的这个性质,但我离散数学掌握的马马虎虎,如果是学得好的大佬的话应该是很容易想出这种解法的。

那么问题就变得很简单了,把K -1变成二进制后再由高到低遍历各个位,如果该位为1就把当前值取反(初始为0),最后就能得到正确答案。

代码

class Solution {
public:
    int kthGrammar(int N, int K) 
    {
      vector<int> binary;
      int quotion = K - 1;
      int num = 0;
      
      //用辗转相除法求二进制值
      while (quotion > 0)
      {
        binary.push_back(quotion % 2);
        quotion /= 2;
      }
      
      //遍历二进制的值
      for (int i = binary.size() - 1; i >= 0; i--)
        if (binary[i] == 1) num = (num + 1) % 2;
      return num;
    }
};
算法设计分析题库六 1.单选 回溯法在问题的解空间树中,按( B )策略,从根结点出发搜索解空间树。 A.扩展结点优先 B.深度优先 C.广度优先 D.活结点优先 2单选 程序块( C )是回溯法中遍历排列树的算法框架程序。 | A.void backtrack (int t) { if (t>n) output(x); else for (int i=0;i<=1;i++) { x[t]=i; if (legal(t)) backtrack(t+1); } } | B. 阅读详情

相关推荐

数电实训:万年历

万年历

Lmyccq的博客 1万+

(算法设计与分析)实验六 分支限界法

一、实验目的 理解并实践分支限界算法。 二、 实验要求 完成教材第6章8个应用范例中的至少3个(任选3个实现即可)。 三、实验步骤与结果 (1)布线问题: 代码: #include<iostream> #include<queue> #include<fstream> using namespace std; ifstream fin("map.txt"); typedef struct Position { int row; int col; } Pos

weixin_44209522的博客 3922

基于Arduino与Velostat的智能鞋垫:DIY足底压力监测系统全解析

压力传感器是物联网和健康监测领域的基础元件,其核心原理是将物理压力转换为可测量的电信号。通过压阻效应,材料的电阻值随压力变化,从而实现压力感知。这项技术为低成本、定制化的健康监测方案提供了可能,尤其在运动分析和康复训练中具有重要价值。本文聚焦于利用Velostat压敏材料和Arduino平台,详细解析如何从传感器制作、信号调理到无线数据传输,构建一套完整的足底压力监测系统。文中深入探讨了传感器阵列构建、信号滤波等关键技术,并针对常见问题提供了实用的解决方案,为创客和开发者实现可穿戴健康监测设备提供了清晰的工

weixin_32818781的博客 400

算法设计与分析 实验报告

算法设计与分析实验报告题目一:矩阵相乘题目二:最长公共子序列题目一:矩阵相乘一.问题描述给定n个矩阵{A1,A2,... ,An},其中这n个矩阵是可相乘的,i=1,2,...,n-1。算出这n个矩阵的相乘积A1A2 。。。An。补充:如果两个矩阵A和B是可相乘的,那么A的列数要和B的行数是相同的,否则,这两个矩阵是不可相乘的。它们的相乘结果矩阵C的行数是A的行数,而列数是B的列数。二.问题分析由

sunjiangangok的博客 8402

使用MLP解决OCR问题(OpenCV)(下)

分类模型:        分类模型涉及的一个比较关键的问题就是输出的10维向量是如何与具体的类别挂钩的。实际上:10维向量的每一位都代表一类,在对于训练集的表达中,如果输入数据是0,则10维向量的第一位赋值为1,其余均为0。即0对应[1,0,0,0,0,0,0,0,0,0]。MLP模型训练完成后,就需要对用户输入的数据所属类别进行判定。这时得到的输出数据基本不可能是正好的所属类为1,其他位置为0

qq_18515405的专栏 1906

小白 虚拟机 kali_Linux安装 详细教程

安装版本:VMmare workstation pro kali_Linux 安装环境:Window10 首先我们先了解一下什么是kali_linux: Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统。每一季度更新一次。由Offensive Security Ltd维护和资助。最先由Offensive Security的Mati Aharoni和Devon Kearns通过重写BackTrack来完成,BackTrack是他们之前写的用于取证的Linux发行

m0_50917178的博客 9万+

educoder算法设计与分析 实验六 分支限界法拓展

实验六 分支限界法拓展第1关:装载问题 (FIFO 优先队列法)第2关:装载问题 (最优队列法) 第1关:装载问题 (FIFO 优先队列法) 题目描述:   有一批共个集装箱要装上 2 艘载重量分别为 C1 和 C2 的轮船,其中集 装箱 i 的重量为 Wi ,且 装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。 容易证明:如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。 (1)首先将第一艘轮船尽可能装满; (2)将剩余的集装箱装上第二艘轮船。

xingcheng12345的博客 1467

Claude Code + 自定义模型体验

AI 编程工具的发展突飞猛进:Cursor 横空出世,推出了“Agent 模式”;新竞争者如 Windsurf 也纷纷加入战局。几乎所有产品都开始转向“代理式(agentic)”开发模式——不再依赖单次 LLM 响应进行补全,而是让大模型在一个循环中调用各种工具,来完成更复杂的任务:分析代码库上下文、读取网页与文档、编译程序、运行测试、修复失败构建或测试、不断迭代等。

西京刀客 5791

算法设计与分析基础(六)

算法设计与分析基础(六) 练习题 练习一 对 f(n)=n, 并且 a = b 的情况,证明递归方程T(n)=aT(n/b)+f(n)的解为O(nlogn). 证明: 练习二 设计求解n个数字之和的分治算法,给出伪代码描述并分析算法的计算复杂度(每次分为2个子问题)。 算法思想:将n个待相加的元素分割成2个大致相等的子集合A、B;对每一个子集合分别递归求和;再将每个子集的和相加。当n等于1时递归终止,此时所求之和为该元素自身。 伪代码: Algorithm Sum (A[0 ... n-

BKSW.的博客 1961

别再乱调NvM_WriteBlock了!手把手教你搞懂Autosar NVM状态机与读写时序

本文深入解析Autosar NVM状态机与读写时序,帮助开发者避免常见错误。通过详细的状态机解读、最佳实践代码示例和异常处理策略,提升嵌入式系统中数据存储的可靠性。特别针对NvM_WriteBlock的调用逻辑和状态机机制进行实战讲解,解决工程师在实际开发中遇到的异步写入问题。

weixin_33701617的博客 344

博途S7-1500T 使用工艺对象驱动液压轴(含SimaHydTO库)

利用工艺对象控制液压轴位置含PLC控制和仿真程序文档资料下载地址如下:液压比例伺服阀的相关应用知识请参看下面的博客文章:液压位置闭环控制(比例伺服阀应用)_RXXW_Dor的博客-优快云博客。

RXXW_Dor的博客 2896

算法设计与分析(六

Merge k Sorted Lists 题目 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. Example: Input: [ 1-&amp;gt;4-&amp;gt;5, 1-&amp;gt;3-&amp;gt;4, 2-&amp;gt;6 ] Output: 1-&amp;gt;1-&amp;gt

Vilin的博客 248

YOLOV26详解 从原理到部署

计算机视觉领域最具影响力的目标检测框架迎来重大里程碑。2026年1月,Ultralytics 正式发布 YOLOv26——这不是一次简单的版本迭代,而是一场面向边缘计算时代的架构重构。本专栏基于 Ultralytics 官方技术白皮书、YOLO Vision 2025 大会首发内容及国际前沿研究成果,系统拆解 YOLOv26 从算法原理到工程落地的全栈技术体系。与常规教程不同,我们聚焦与,帮助你在端侧 AI 部署的实战中掌握核心竞争力。

u012133341的博客 2017

算法设计与分析:实验六 贪心法

该资源任何时刻只能被一个活动所占用,活动i有一个开始时间bi和结束时间ei(bi<ei),其执行时间为ei-bi,假设最早活动执行时间为0。先利用重载排序活动结束时间,使其依次递增排序,选结束时间最早的活动来占用资源,假设一个变量来记录前一个兼容活动的结束时间,记录结束时间最早的活动结束时间,下一步选择开始时间大于等于结束时间最早的活动的结束时间,使其开始时间变成选择的活动的结束时间,按照这个方法依次选择,直至排序后活动结束时间的最后一个活动,得出最大兼容活动的子集,即所有安排活动个数最多。

菜鸟的博客~ 1482

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

《算法分析与设计》实验一到六

实验一 归并排序求逆序对 原理:归并排序是采用分治的方法,均摊了每一段的时间复杂度 时间复杂度为O(nlogn)O(nlogn)O(nlogn),空间复杂度为O(n)O(n)O(n) 原理在装进新数组的时候记录逆序对的个数 比如当a[i]>a[j]a[i]>a[j]a[i]>a[j] 分界点为midmidmid 那么这一段的逆序对数量 为mid−i+1mid-i+1mid−i+1 结果: #include<bits/stdc++.h> using namespace std;

weixin_43601905的博客 948

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

算法设计与分析实验报告——实验六 随机化算法

如果算法返回结果为true,这里用1表示,则随机选择的数组元素x是数组T的主元素,如果返回的结果为false,这里用0表示,则数组T可能含有主元素,而随机选择的元素x并不是数组T的主元素。设T[1:n]是一个含有n个元素的数组。在棋盘上相继的各行中随机地放置皇后,并注意使新放置的皇后与已经放置的皇后互不攻击,直至n个皇后均已相容地放置好,或已经没有下一个皇后的可放置位置为止。②主函数中输入皇后数量,初始化Queen类,设置stop值,即停止随机选择位置的次数,然后进行循环,直到找到可以放置皇后的解为止。

m0_62795276的博客 1161

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

算法设计与分析 实验六 论文评审问题

算法设计与分析 实验六 论文评审问题

吃饭的博客 690

【算法设计与分析】第一至六讲实验

算法实验

m0_65787507的博客 666

【深圳大学算法设计与分析】实验六 最大流应用问题

通过本次实验,加深了对最大流算法的理解和运用,加深了流网络、割、增广路径、残留网络、残留容量等概念的理解。理解了Ford-Fulkerson算法、EDMONDS-KARP算法、Dinic算法。

归忆_AC的博客 2635

算法设计与分析 实验六 回溯法

给定一个 N×M 方格的迷宫,迷宫里有T处障碍,障碍处不可通过。现在要在一个 N×N 的棋盘上放置 N 个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,请问有多少种放置方法。入:7 出:1+1+1+1+1+1+1 1+1+1+1+1+2 ……入:4 1 1 1 -1 -1 1 -1 -1 出:7.41。第1行:黑马到(1,1)的步数 第2行:白马到(1,1)的步数 假设棋盘为。入:2 2 1 1 1 2 2 1 2 出:1。

m0_53227534的博客 948

算法设计与分析 实验六 最大流解决论文评审问题

目录一、实验目的与要求1、实验目的:2、实验亮点:二、实验内容与方法三、实验步骤与过程(一)、设计流网络(二)、流网络中最大流与论文评审问题解的关系1、Edmonds-Karp 算法(1)算法思想:(2)算法关键定理及其证明:2、Dinic 算法(1)算法思想(2)算法流程:(3)算法实现与伪代码:(4)时间复杂度分析:(四)、求解具体分配方案:四、实验结论或体会五、思考1、算法主要思想2、算法实现:3、引入优先队列进行优化4、BFS优化:5、GAP优化 一、实验目的与要求 1、实验目的: (1)掌握最大流

上山打老虎的博客 3792

算法设计与分析实验六:分支限界法

通过这次实验我理解了分支限定法采用广度优先方法,以最小耗费优先方式搜索解空间树,求解目标是找出满足约束条件的一个解,是从众多分支的路径中,同时地毯式搜索找到符合结果的路径或路径集的方法。假设有n个任务由k个可并行工作的机器完成,完成任务i需要的时间为ti。设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。对任意给定的整数n和k,以及完成任务i需要的时间为ti(i=1~n)。设计一个优先队列式分支界限界法,计算完成这n个任务的最佳调度。第2 行的n个正整数是完成n个任务需要的时间。

小柴 1738

算法设计与分析2023秋-头歌实验-实验六 贪婪算法

思考:如果商店售货员找给 1 个顾客 140 元,假设钱币的面值有九种:100 元,70 元,50 元,20 元,10 元,7 元,5 元,2 元,1 元。在所有按这种操作方式最后得到的数中,最大的记作 max,最小的记作 min,则该数列的极差定义为M=max-min,请你使用贪心算法设计编程输出他们的极差。商店售货员找给 1 个顾客 n 元,用以下七种面值的纸币:100 元,50 元,20 元,10 元,5 元,2 元,1 元。编程对给定的 n 和 s,寻找一种方案使得剩下的数字组成的新数最小。

杨明金的博客 4863

算法设计与分析——排序算法(六):希尔排序

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。 def shell_sort(arr): n = len(arr) gap = int(n/2) while gap > 0: for i in range(gap,n): temp =

冯·诺依曼 1万+

算法设计与分析(python版)-作业六

1 .容易(5分)有关随机化算法错误的是()A. 随机化算法的特征是对所求解问题的同一实例用同一随机化算法求解两次可能得到完全不同的效果,这两次求解问题所需的时间甚至所得到的结果可能会有相当大的差别。B. 数值随机化算法常用于数值问题的求解,所得到的解都是精确解。C. 蒙特卡罗算法用于求问题的准确解,但解不一定正确。D. 舍伍德算法引入随机性来降低最坏情况出现的概率,从而消除或减少问题好坏实例之间的时间消耗的差异。2 .容易(5分)有关估算π值的随机化算法说法错误的是()

qq_61727355的博客 1748

算法设计与分析:实验六 图论——最大流应用问题

算法设计与分析:实验六 图论——最大流应用问题 图论基本知识,最大流模型,最大流最小割,求解最大流算法其中包括: Ford-Fullkerson算法、Edmonds-Karp算法、Dinic算法、优化Dinic算法

gyeolhada的博客 2049
上一篇: 算法设计与分析(五)
下一篇: 算法设计与分析(七)
Maple_Lai
博客等级 码龄10年 2粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值