首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【递归】递归求n个数中的最大值

作者:每天都要记得刷题(●’◡’●) 时间:2022/04/04 本篇感悟:举一反三,由求 n的阶乘联想到递归求n个数中的最大值,对递归有了更深的了解。...文章目录 ⭐题目(代码在文末) ⭐递归思想 ⭐求前n个斐波那契数 ⭐具体代码(答案) ⭐题目(代码在文末) 使用递归求 55 ,22, 155, 77, 99这5个数中的最大值 ⭐递归思想 Q...往里套用就是: 关键:重复把求最大值这个过程重复再重复,知道找到递归出口 1.当数组只有一个元素的时候,这个数就是最大值 2.但是当n>1时,从数组下标大的一端开始自身调用**,将最后一个数和n-...1个数中的最大值进行比较(假设我们已知)** 3.然后就是求n-1个数中的最大值,也就是重复了以上的步骤 4.知道我们到了递归出口,再归回去就可以了。...a[n - 1] : find_max(a, n - 1); } int main() { //递归求n个数中的最大值 int a[5] = { 55,22,155,77,99 }; int

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    海量数据处理 - 找出最大的n个数(top K问题)

    建堆时间复杂度是O(mlogm),算法的时间复杂度为O(nmlogm)(n为10亿,m为10000)。 优化的方法:可以把所有10亿个数据分组存放,比如分别放在1000个文件中。...第三种方法是分治法,将1亿个数据分成100份,每份100万个数据,找到每份数据中最大的10000个,最后在剩下的100*10000个数据里面找出最大的10000个。...100万个数据里面查找最大的10000个数据的方法如下:用快速排序的方法,将数据分为2堆,如果大的那堆个数N大于10000个,继续对大堆快速排序一次分成2堆,如果大的那堆个数N大于10000个,继续对大堆快速排序一次分成...2堆,如果大堆个数N小于10000个,就在小的那堆里面快速排序一次,找第10000-n大的数字;递归以上过程,就可以找到第1w大的数。...得到结果后,各个机器只需拿出各自出现次数最多的前N个数据,然后汇总,选出所有的数据中出现次数最多的前N个数据,这实际上就是Reduce过程。

    5.3K40

    第 N 个数

    所以,要想找出序列中第 n 位对应的数字,我们的第一步应该是先去寻找出这个数字来源于哪个数字。...那么,要想找出序列中第 n 位对应的数位,我们的第一步应该是先去寻找出这个数位来源于哪个数字。 先来找规律。...根据上面的结论,n 是以 6 为单位不停的在长度为 6 的 100000 这个数字上累加 1 ,意味着 n 每隔 6 个数就来到下一个数字,那么将 n 对 6 取余后的数字就是它在这个数字上的顺序。...curNum 表示落在哪个数字上 len 表示这个数字的长度 count 表示在这个数字的第几个位置上 由此,这道题目就解决了,总结一下: 1、先找出 n 是落在长度为多少的数字上 2、再找出 n 落在哪个数字上...3、再找出 n 落在这个数字的第几位 4、最后计算出这个数位来 顺着这个思路给出代码: // 登录 AlgoMooc 官网获取更多算法图解 // https://www.algomooc.com //

    64810

    寻找最大的K个数

    给你n个数,让你找出其中最大的K个数。 解法1: 很多人上来就对其进行排序,选用不同的排序方法有不同的时间复杂度,这里我们假设使用了最快的快排,时间复杂度为O(n*logn)。...通过排序我摘出前K大的数。 但也许快排不是最优的,我们只找最大的K个数,何必要对所有的数进行排序,我们只需要进行局部排序即可,时间复杂度大概是O(N*K)。...在这里,我们只要在递归过程中选包含最大的K个数的部分进行完整的快排,而对于其他的部分只进行快排的一部分。 关于使用快排求第K大数的方法参见其他博文。...在这个基础上,只需要做小小的改进就可以完成寻找最大K个数的功能了,时间复杂度O(N)。...结果遍历所有元素后,我们都得到保存最大K个数的堆,也就到达了我们的目的。

    78620

    【数据结构和算法】最大连续1的个数 III

    一、题目描述 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。...当 A[right] 为 0,说明滑动窗口内增加了一个 0; left 被动右移:判断此时窗口内 0 的个数,如果超过了 K,则 left 指针被迫右移,直至窗口内的 0 的个数小于等于 K 为止。...滑动窗口长度的最大值就是所求。 2.2 滑动窗口解题模板 滑动窗口算法是一种常用的算法,用于解决数组或列表中的子数组问题。...下面是一个滑动窗口算法的解题模板: 定义窗口大小:首先需要确定滑动窗口的大小,即每次滑动时包含的元素个数。 初始化窗口:将窗口的起始位置设置为0,窗口大小设置为n,其中n为数组或列表的长度。...下面是一个具体的例子,使用滑动窗口算法求解数组中连续子数组的最大和: def maxSubArray(nums): if not nums: return 0

    20610

    【优选算法】——滑动窗口——1004. 最大连续1的个数 III

    最大连续1的个数 III 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。...提示: 1 <= nums.length <= 105 nums[i] 不是 0 就是 1 0 <= k <= nums.length 2.解法(滑动窗⼝): 算法思路: 不要去想怎么翻转,不要把问题想的很复杂...因此,我们可以把问题转化成:求数组中⼀段最⻓的连续区间,要求这段区间内 0 的个数不超 过 k 个。既然是连续区间,可以考虑使⽤「滑动窗⼝」来解决问题。 算法流程: a....检查 0 的个数是否超标: • 如果超标,依次让左侧元素滑出窗⼝,顺便更新哈希表的值,直到 0 的个数恢复正 常; iii....2.图解 3.代码实现 1.C语言 // 辅助函数,返回两个整数的最大值 int max(int a, int b) { return (a > b) ?

    7510

    求一个数组的最大k个数(java)

    问题描述:求一个数组的最大k个数,如,{1,5,8,9,11,2,3}的最大三个数应该是,8,9,11 问题分析:     1.解法一:最直观的做法是将数组从大到小排序,然后选出其中最大的K个数,但是这样的解法...,复杂度是O(logn*n),但是有时候并不需要排序,用简单的选择排序,或者是冒泡排序,那么就K轮的交换或者是选择,就可以得出结论,复杂度是O(n*k),当K很大的时候排序可能是更好的解法,当K小的时候用选择或者是冒泡效率会更加的高...2.解法二:不对前K个数进行排序,回忆快排的算法中,那个partition函数,就是随机选择数组中的一个数,把比这个数大的数,放在数组的前面,把比这个数小的数放在数组的 后面,这时想如果找出的随机数,最终位置就是...K,那么最大的K个数就找出来了,沿着这个思路思考问题,但是这个函数,最后的索引位置并不一定是K,可能比K大也可能比K小,我们把找出的数组分成两部分sa,sb,sa是大的部分,sb是小的部分,如果sa的长度等于...K中元素的一部分,再从sb中找到,k-m个最大的元素,组合起来就是最终的结果,那么这时把问题简化成从sb中找k-m个最大的元素,所以总体来说这是一个递归的过程,虽然复杂大也是O(n*logn)但是,每一次数据量都会减少所以会更加的快

    86620

    最大子序列和O(N)算法简单分析『神兽必读』

    对于一个全为负数的序列,最长公共子序列的和值应该是0,理由在于,由0个整数所组成的空子序列也是一个子序列——最大子序列和问题从O(N^3)到线性的算法 其他情况大家也能理解了。...先看算法,算法来自《数据结构与算法分析——C语言描述》 int MaxSubsequenceSum(const int A[], int N) { int ThisSum, MaxSum, j;...显然这个算法有一个for循环,整体时间复杂度可以看作O(N)。...---- UPDATE 或许你会想到了,有时候最大子序列和是某一小段的话,比如是后半段,但是这个算法明显给人的感觉就是一路加和过来呀,好像是认为越长的子序列和越大呀?!...这里继续做一个假设:5, 6,-2, -3,-1, -7,8, 9 明显最大的子序列是8,9,中间跨度的那些负数都不应该加起来,这样的想法的确是对的,但是这个算法也做到了啊。

    95020

    算法简单题,吾辈重拳出击 - 前 n 个数字二进制中 1 的个数

    简单与难,也并非是绝对的,每个人的感受都会不同。更重要的是,通过这些题构建基础的算法思路,建立信心。 动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。...前 n 个数字二进制中 1 的个数 给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。...0 1 --> 1 2 --> 10 3 --> 11 4 --> 100 5 --> 101 第一反应 n=2,就要写出 0、1、2 的二进制,分别是 0 、1、10,分别有1的个数:0、1、1 n...=3,就要写出 0、1、2、3 的二进制,分别是0、1、10、11,分别有1的个数:0、1、1、2 同理 n=4 => [0,1,1,2,1] n=5 => [0,1,1,2,1,2] .........i++){ res.push(countOnes(i)) } return res }; 第四反应 上述算法需要对每个数都做 countOnes 操作,countOnes

    25130

    打印1到最大的n位数

    这道题是面试过可能会遇到的手写代码题。如n为3时,那么需要打印1到999。需要注意的是当输入的n很大时,最大的n位数是不能通过int或者long long int来表示,此时可以使用字符数组来存储。...思路一: 1到n位最大数值采用字符数组存储。数值的高位存储在字符数组的低地址位。...//先对字符串数组初始化 while ( Increment(numchar,n) ) //字符串数组++,如果已经是最大则返回false { PrintNum...思路二: 换思路,n位所有十进制数其实就是n个0-9的数全排列的过程,只是排在前面的0我们不打印出来。 全排列可以用递归去写,递归结束条件是我们已经设置了数字的最后一位。...总结: 如果面试题是关于n位的整数并且没有限定n的取值范围,或者是输入任意大小的整数,那么这个题目很有可能是需要考虑大数问题。字符串是一个简单、有效的表示大数的方法。

    37510

    求一个数组中子数组的最大和算法(Java实现)

    前几天在微信订阅号“待字闺中”中看到的一篇文章《小技巧求一个数组中子数组的最大和》,提供下Java的实现,并且在对题目做下小修改,本来打算直接在微信里直接回复,但是发现无法回复,然后整理出一篇简短博客吧...原题及解答     来自《小技巧求一个数组中子数组的最大和》;     题目:     输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。...求所有子数组的和的最大值。要求时间复杂度为 O(n)。...解答:  【只有子数组“前半部分”的和为正数时,子数组的求和才有可能最大】,在这个trick条件下,只需要遍历一次数组就可以。算法是:当从头开始遍历的元素的求和为正数时,继续向后遍历。...当全为正数时,最大的和自然就是所有元素的和,当全为负数时,最大和自然就是其中最大的那个负数的值。通过此算法都能得到相应的结果。

    1.6K80

    LeetCode - N叉树的最大深度

    今天很开心的收到了阿里的offer邮件。 这题是LeetCode第559题,求N叉树的最大深度,难度为简单,两月以前的做的一题。...给定一个 N 叉树,找到其最大深度。...最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。 例如,给定一个 3叉树 : ? 我们应返回其最大深度,3。 说明: 树的深度不会超过 1000。 树的节点总不会超过 5000。...来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-depth-of-n-ary-tree 著作权归领扣网络所有。...首先遍历根节点的每个子节点,每个子节点的初始深度都为1。 在遍历每个子节点时,都将深度加1,再次遍历子节点的每个子树,获取子树中深度最深的深度。

    59710
    领券