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

简单记录牛客top101算法题(初级题C语言实现)BM17 二分查找 BM21 旋转数组的最小数字 BM23 二叉树的前序遍历

1. BM17 二分查找

   要求:给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1。

输入:[-1,0,3,4,6,10,13,14],13
返回值:6
说明:13     出现在nums中并且下标为6   

1.1 自己的整体思路

  1. 使用二分法,先定义三个指针,左指针,右指针,中间指针。
  2. 比较中间指针对应数值与目标数值是否相等,如果相等直接返回该点索引;如果目标值大于中间值,则移动左指针,另其为中间指针加上1;如果目标值小于中间值,则移动右指针,另其为中间指针减1。
  3. 直到左指针大于右指针,结束整个循环,这时是没有找到与目标值对应的索引的。
#include <stdbool.h>
#include <stdlib.h>
int search(int* nums, int numsLen, int target ) {// write code hereint n_pre = 0;                           //首指针位置int n_next = numsLen - 1;                //尾部指针位置int n_mid = (n_pre + n_next) / 2;        //中间指针位置if (numsLen == 0) {                      //数组为空的情况return -1;}while ( nums[n_mid] != target ) {        //中间值是否等于目标值if ( nums[n_mid] < target) {         //目标值在中间右侧n_pre = n_mid + 1;                //更新左索引n_mid = (n_pre + n_next)/2;       //更新中间索引}else {n_next = n_mid - 1;                //更新右索引n_mid = (n_pre + n_next)/2;       //更新中间索引}if ( n_pre > n_next ) {                //左指针大于右指针,结束整个循环return -1;}}return n_mid;
}

  开始上面的结束条件写成了这样的了:

    if ( n_pre == n_next ) {                  //没有找到,最终两个索引会重合   会出现在右边的情况,不是一直到最后都会重合的if (nums[n_pre ] == target) {return n_pre ;}else {return -1;}}

  认为两个指针一定会重合,只要判断重合时候的情况就能结束整个循环,但是未通过所有的测试。

1.2 其他的方法(标准判断方法)

  判断条件是左索引是否大于右索引。

int search(int* nums, int numsLen, int target ) {// write code hereif(numsLen == 0) return -1;int left=0, right=numsLen-1;while(left<=right) {int mid = left+(right-left)/2;if(nums[mid]==target) return mid;if(nums[mid]<target) left=mid+1;if(nums[mid]>target) right=mid-1;}return -1;
}

2. BM21 旋转数组的最小数字

   要求:有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。

输入:[3,4,5,1,2]
返回值:1

  这个题开始使用的分类讨论的情况,情况太多了,最后也没有写出来,下面是参考大佬的写法:
核心思想:

1.计算中间位置 mid,并与 right 指针所指向的元素进行比较:
 如果 rotateArray[mid] > rotateArray[right],说明最小值在 mid 右侧,将 left 更新为 mid + 1。
 如果 rotateArray[mid] < rotateArray[right],说明最小值在 mid 左侧或就是 mid,将 right 更新为 mid。
 如果 rotateArray[mid] == rotateArray[right],无法确定最小值在哪一侧,但是可以排除 right 指针所指向的元素,将 right 向前移动一位,缩小搜索范围。
2. 循环继续,直到 left 和 right 指针相邻或重合。最终,right 指向的位置即为最小值所在位置。

int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {int left=0, right=rotateArrayLen-1;while(left<right) {int mid = left+(right-left)/2;if(rotateArray[mid]>rotateArray[right]) left=mid+1;         //说明最小值在右边else if(rotateArray[mid]<rotateArray[right]) right=mid;     //说明最小值在左边else right--;    //22212或者10111                            //不能说明在左边还是右边,但是肯定不是右值,索引减去1再进行比较                        //关注右边,从右边出发}return rotateArray[right];
}

3. BM23 二叉树的前序遍历

   要求:给你二叉树的根节点 root ,返回它节点值的前序遍历。
                    在这里插入图片描述

输入:{1,#,2,3}
返回值:[1,2,3]

3.1 自己的整体思路

  1. 使用二叉树的前序遍历方法,递归完成二叉树元素的访问。
  2. 这里访问二叉树的元素,需要传一个变量(接收数组的索引地址),因为最后结果需要返回该索引值。

具体代码如下:

#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
void visit_root(struct TreeNode* p ,int *arr, int *a){         //访问二叉树的元素,存到数组中去*(arr + *a) = p->val;//arr[*a] = p->val;    //写成这样也是可以的// *a++;               //这样是错的,优先级不一样,++的优先级要高(*a)++;          //索引加1}void  Preorder(struct TreeNode* p , int *arr, int *a){        //遍历二叉树if (p != NULL) {visit_root(p , arr, a);Preorder(p->left,  arr, a);    //递归左子结点         //这行代码为空的时候,才会运行到下一行Preorder(p->right, arr, a );   //递归右子结点}
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){//前序遍历 先根,再左,再右struct TreeNode* cur =  root;                           //接收根结点int*  result = (int *)malloc(100 * sizeof(int));        //申明一个100的空数组int a = 0;                                              //接收数组的索引int *i = &a;                                            //接收a的地址Preorder(cur, result, i);                               //遍历二叉树 *returnSize = *i;                                       //必须给行号 ,卡了半天return result;
}

3.2 大佬的方法

  1. 先判断二叉树有多少元素,这样再动态申请多大的内存。
  2. 遍历二叉树即可。
int TreeSize(struct TreeNode* root)
{if(root==NULL){return 0;}return TreeSize(root->left)+TreeSize(root->right)+1;
}
void preorder(struct TreeNode* root, int* a,int *i) 
{if(root==NULL){return ;}a[*i]=root->val;++(*i);preorder(root->left,a,i);preorder(root->right,a,i); 
}
int* preorderTraversal(struct TreeNode* root, int* returnSize ) 
{  int i=0; int size=TreeSize(root);int* a=(int*)malloc(size*sizeof(int));preorder(root,a,&i);*returnSize=size;return a;
}

3.3 小结

3.3.1 malloc函数

   malloc(memory allocation)函数是用于动态分配内存的标准库函数之一。它是在程序运行时从堆(heap)中申请一块指定大小的内存空间,以供程序使用。
   malloc函数的原型如下:
size:要分配的内存空间的大小,以字节为单位。通常使用sizeof运算符来计算要分配的空间大小,以确保正确性。
返回值:malloc函数返回一个void指针,指向已分配内存块的起始地址。由于返回类型是void *,您需要将这个通用指针转换为适当类型的指针,然后才能访问和操作分配的内存。

void *malloc(size_t size);

   举例分配一个包含10个int元素的数组:

 int *array = (int *)malloc(10 * sizeof(int));

注意:

  1. malloc分配的内存块是未初始化的,其中的值是不确定的。您应该确保在使用之前将其初始化。
  2. 在使用完分配的内存后,必须使用free函数释放它,以避免内存泄漏。
  3. 在调用malloc后,应该检查返回的指针是否为NULL,以防止内存分配失败。
  4. malloc函数分配的内存是在堆上,与局部变量不同,不会在函数退出后销毁,需要手动释放。

3.3.2 *和++的优先级

++操作符的优先级比*操作符更高,因此会先执行++操作,然后再执行*操作。下面的a是一个int型变量指针
*a++;       //指针会往下加1,再去该地址里面的值,地址变了
(*a)++;     //取指针a对应的变量值,把变量值加1,地址没变

相关文章:

简单记录牛客top101算法题(初级题C语言实现)BM17 二分查找 BM21 旋转数组的最小数字 BM23 二叉树的前序遍历

1. BM17 二分查找 要求&#xff1a;给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff08;下标从 0 开始&#xff09;&#xff0c;否则返回 -1。 输入&#xff1a…...

日常BUG——Java使用Bigdecimal类型报错

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 直接上代码&#xff1a; Test public void test22() throws ParseException {System.out.p…...

为Windows Terminal设置背景图片

直接通过界面上选项无法达到修改背景图片的目的&#xff0c;后再在官网&#xff0c;和git上找到通过修改配置文件来更改背景图片 首先打开设置界面 点击左下角打开settings.json文件 在json中profiles关键字default选项相面增加几个key,就像下面 修改前修改后 修改后的termin…...

【Spring】-Spring中Bean对象的存取

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Framework】 主要内容&#xff1a;往spring中存储Bean对象的三大方式&#xff1a;XML方式(Bean标签)&#xff1b;五大类注解&#xff1b;方法注解。从spring中取对象的两种方式…...

机器人CPP编程基础-03变量类型Variables Types

机器人CPP编程基础-02变量Variables 全文AI生成。 C #include<iostream>using namespace std;main() {int a10,b35; // 4 bytescout<<"Value of a : "<<a<<" Address of a : "<<&a <<endl;cout<<"Val…...

或许有用的开源项目平台——物联网、区块链、商城、CMS、客服系统、低代码、可视化、ERP等

摘自个人印象笔记Evernote Export wumei-smart-物美智能开源物联网平台 官网&#xff1a;https://wumei.live/ gitee&#xff1a;https://gitee.com/kerwincui/wumei-smart 一个简单易用的物联网平台。可用于搭建物联网平台以及二次开发和学习。适用于智能家居、智慧办公、智慧…...

火车头采集伪原创插件【php源码】

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python代码大全和用法&#xff0c;python代码大全简单&#xff0c;现在让我们一起来看看吧&#xff01; 火车头采集ai伪原创插件截图&#xff1a; 1、题目&#xff1a;列表转换为字典。 程序源代码&#xff1a; 1 #!/us…...

【数学】CF1514 C

Problem - 1514C - Codeforces 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>using i64 long long;constexpr int N 2e5 10; constexpr int M 2e5 10; constexpr int mod 998244353;void solve() {int n;std::cin >> n;std:…...

SqlServer基础之(触发器)

概念&#xff1a; 触发器&#xff08;trigger&#xff09;是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法&#xff0c;它是与表事件相关的特殊的存储过程&#xff0c;它的执行不是由程序调用&#xff0c;也不是手工启动&#xff0c;而是由事件来触发&#x…...

数据结构刷题训练:队列实现栈

目录 前言 1. 题目&#xff1a;使用队列实现栈 2. 思路 3. 分析 3.1 创建栈 3.2入栈 3.3 出栈 3.4 栈顶数据 3.5 判空和 “ 栈 ” 的销毁 4. 题解 总结 前言 我们已经学习了栈和队列&#xff0c;也都实现了它们各自的底层接口&#xff0c;那么接下我们就要开始栈和队列的专项刷…...

(统计学习方法|李航)第四章 朴素贝叶斯算法——贝叶斯估计

贝叶斯估计方法&#xff1a; 计算男女时只有两个值&#xff0c;所以K2 贝叶斯估计就是拉普拉斯平滑 估计方法&#xff1a;为什么叫做贝叶斯估计呢&#xff1f; 例题&#xff1a; 重新回顾以下朴素贝叶斯&#xff1a; 对他求导&#xff0c;求出最大值 得到了色i他的估计值&…...

企业直播MR虚拟直播(MR混合现实直播技术)视频介绍

到底什么是企业直播MR虚拟直播&#xff08;MR混合现实直播技术&#xff09;&#xff1f; 企业直播MR虚拟直播新玩法&#xff08;MR混合现实直播技术&#xff09; 我的文章推荐&#xff1a; [视频图文] 线上研讨会是什么&#xff0c;企业对内对外培训可以用线上研讨会吗&#x…...

React Fiber: 从 Reconciliation 到 Concurrent Mode

React Fiber 是 React 中的一种新的协调算法&#xff0c;它的主要目的是提高 React 的性能和可维护性。在 React Fiber 之前&#xff0c;React 使用了一种叫做 Stack Reconciliation 的算法来处理组件的更新和渲染。但是 Stack Reconciliation 存在一些问题&#xff0c;比如无法…...

【PostgreSQL内核学习(十一)—— OpenGauss源码学习(CopyTo)】

可优化语句执行 概述什么是列存储&#xff1f;列存的优势 相关函数CopyToCStoreCopyToCopyStatetupleDescCStoreScanDesc CStoreBeginScanRelationSnapshotProjectionInfo GetCStoreNextBatchRunScanFillVecBatchCStoreIsEndScan CStoreEndScan 声明&#xff1a;本文的部分内容…...

计算机网络 网络层 IPv4地址

A类地址第一位固定0 B类10 其下同理...

【程序员社交】多和高层次人群交流

定义问题&#xff1a;如何多和高层次人群交流获取经验提升自己&#xff1f; 收集信息&#xff1a;通过社交媒体、行业论坛、行业大会等途径获取高层次人群的信息和观点&#xff0c;并了解他们的工作经历、技能和能力。 分析信息&#xff1a;分析收集到的信息&#xff0c;了解…...

机器学习笔记 - 基于C++的​​深度学习 三、实现成本函数

机器学习中的建模 作为人工智能工程师,我们通常将每个任务或问题定义为一个函数。 例如,如果我们正在开发面部识别系统,我们的第一步是将问题定义为将输入图像映射到标识符的函数F(X)。但是问题是如何知道F(X)公式? 事实上,使用公式或一系列固有规则来定义F(X)是不可行的(…...

lazada、shopee店铺如何利用测评提高权重和排名?

在 lazada、shopee平台上开店后&#xff0c;卖家们必须对店铺的权重进行更多的关注。如果店铺的权重越高&#xff0c;那么它就会带来更多的流量和更多的订单&#xff0c;那么在 lazada、shopee平台上开设一家店铺&#xff0c;该怎样增加它的店铺权重和排名呢&#xff1f; laza…...

安全第二次

一&#xff0c;iframe <iframe>标签用于在网页里面嵌入其他网页。 1&#xff0c;sandbox属性 如果嵌入的网页是其他网站的页面&#xff0c;因不了解对方会执行什么操作&#xff0c;因此就存在安全风险。为了限制<iframe>的风险&#xff0c;HTML 提供了sandb…...

125、SpringBoot可以同时处理多少请求?

SpringBoot可以同时处理多少请求? 一、前言二、线程池4大参数图解三、代码示例一、前言 我们都知道,SpringBoot默认的内嵌容器是Tomcat,也就是我们的程序实际上是运行在Tomcat里的。所以与其说SpringBoot可以处理多少请求,到不如说Tomcat可以处理多少请求。 关于Tomcat的默…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...