题目描述

1、 给定严格升序(没有相等元素)的数组a,元素个数为cnt,
查找num在数组中的位置序号(以0位起始)。
如果没找到则返回: 比num小且最靠近的元素位置序号。
若所有元素均大于num则返回-1;请用递归方式实现。
int search(int arr[], int cnt, int num)
{ }

代码

我递归用的不好。这是一位大佬写的。 很巧妙。

  • 函数的第一个参数为地址,这样,数组二分就可以传递地址了
  • 除了极端情况,巧妙的比较了与num的关系
/**

1、 给定严格升序(没有相等元素)的数组a,元素个数为cnt,
查找num在数组中的位置序号(以0位起始)。
如果没找到则返回: 比num小且最靠近的元素位置序号。
若所有元素均大于num则返回-1;请用递归方式实现。 */
int search(int arr[], int cnt, int num)
{ std::cout << "a[0]=" << arr[0] << ", a[1]=" << arr[1] << ", cnt=" << cnt << "\n\n";
// 1.数组的最小值比num还大,那么,数组不存在该元素。
if (arr[0] > num)
return -1; // 2.数组中最大的元素都小于 num, 则 返回靠近num的索引,也就是数组的最大索引
if (num >= arr[cnt - 1])
return cnt-1; // 3.巧妙的比较相邻的两个元素
if (2 == cnt)
return ((num - arr[0]) < (arr[1] - num)) ? 0 : 1; int mid = cnt / 2; // 4. num应该搜索中间值的右边,
if (arr[mid] < num)
return mid + search(arr + mid, cnt - mid, num);
// num应该搜索数组中间值的左边
else if (arr[mid] > num)
return search(arr, mid + 1, num);
// 找到,mid就是要找的索引
else
return mid;
}

调用

准备了1一个数组1,2,3,4,5。 其中输入100退出while循环

int arr[] = { 1, 2, 3, 4, 5 };

while (1)
{
int input = 1;
std::cout << "the array is from 1 to 5. out?100 :";
std::cin >> input; if (100 == input)
break; int ret = search(arr, sizeof(arr) / sizeof(int), input);
std::cout << "ret=" << ret;
std::cout << "\n\n\n";
}

结果

c++ 之面试题(3)数组递归查找的更多相关文章

  1. 递归分治算法之二维数组二分查找(Java版本)

    [java] /** * 递归分治算法学习之二维二分查找 * @author Sking 问题描述: 存在一个二维数组T[m][n],每一行元素从左到右递增, 每一列元素从上到下递增,现在需要查找元素 ...

  2. [LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分);面试题53 - II. 0~n-1中缺失的数字(二分)

    ##面试题53 - I. 在排序数组中查找数字 I ###题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 ...

  3. [javaSE] IO流(递归查找指定文件)

    递归方法,实现查找目录中以.java为后缀的文件路径,并存入文本文件中 定义一个静态方法fileToLine(),传入参数:File对象目录,List集合对象(List<File> 这样做 ...

  4. js经典试题之数组与函数

    js经典试题之数组与函数 1:列举js的全局函数? 答案:JavaScript 中包含以下 7 个全局函数escape( ).eval( ).isFinite( ).isNaN( ).parseFlo ...

  5. Leetcode算法【34在排序数组中查找元素】

    在之前ARTS打卡中,我每次都把算法.英文文档.技巧都写在一个文章里,这样对我的帮助是挺大的,但是可能给读者来说,一下子有这么多的输入,还是需要长时间的消化. 那我现在改变下方式,将每一个模块细分化, ...

  6. LeetCode 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ 题目 在数组中的两个数字,如果 ...

  7. 力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I

    题目 剑指 Offer 53 - I. 在排序数组中查找数字 I 思路1 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录target数组出现的次数,但是这样的时间复杂度是O(n),还是 ...

  8. JS数组2(冒泡排列、数组里面查找数据)

    数组 一.冒泡排列 对数组attr = [1,8,6,4,5,3,7,2,9]进行由大到小排列,用冒泡排列的方法排列时,会对数组进行比较互换.如果前一个数字较大,这2个元素排列方式不变,如果后一个元素 ...

  9. SQL Server使用WITH AS递归查找

    很多时候我们会在数据库表中存储树结构的数据,如菜单:一级菜单.二级菜单.三级菜单... 如果树结构层次比较多,如何能够在只知道某节点的情况下,找到此节点下的所有子级数据呢? 在.NET后台可以定义一个 ...

随机推荐

  1. windows下的python安装pysam报错

    安装pysam时报错: 指定版本仍报错: 使用pysam-win安装: 但是import时不行: 貌似pysam在windows下难以正常配置,还是在Linux中用吧. https://www.jia ...

  2. Docker-Mysql-proxy Mysql Proxy实现读写分离

      Docker-Mysql-proxy Mysql实现读写分离与负载 原理 MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断.改变并转发客户端和后端数据库之间的通信来实现其功 ...

  3. 第三个基础框架 — springMVC — 更新完毕

    1.什么是springMVC? 还是老规矩,百度百科一下 这里面说了一堆废话,去官网瞄一下 官网网址:https://docs.spring.io/spring-framework/docs/curr ...

  4. SimpleNVR如何把安防监控画面推流到微信公众号直播

    背景需求 进入移动互联网时代以来,微信已成为许多企业除官网以外必备的宣传渠道,当3.2亿直播用户与九亿微信用户的势能增加,在微信上开启直播已成为越来越多企业的不二选择. 需求分析 微信公众号作为平台来 ...

  5. 零基础学习java------day8------javabean编写规范,继承,static关键字,代码块,单例设计模式

    0. 今日内容提要 1. javabean书写规范 javabean:一个普通的类,用来描述事物的类,里面不包含任何的业务逻辑,只是用来存储数据. 比如:Teacher,Student,Mobile. ...

  6. 【Penetration】红日靶场(一)

    nmap探查存活主机 nmap -sP 10.10.2.0/24 图片: https://uploader.shimo.im/f/cfuQ653BEvyA42FR.png!thumbnail?acce ...

  7. 【leetocode】55. Jump Game

    You are given an integer array nums. You are initially positioned at the array's first index, and ea ...

  8. 案例 stm32的dma传输过程

    首先说一下:DMA_GetCurrDataCounter返回值是什么 返回值是dma缓存里还剩余多少空间. 上面本来应该是,发一下,改变一下.但是这里有一行是特殊的. long : 461,*ff l ...

  9. Android数据存取

    Android数据存取 一.SharedPreferencesc存取数据 SharedPreferences是使用键值对的方式来存储数据的,也就是在保存一条数据时,需要给这条数据提供一个对应的键,这样 ...

  10. IDEA2021.2安装与配置

    https://blog.csdn.net/qq_37242720/article/details/119349394