# 优雅的算法系列(连载中) **Repository Path**: ccccccccccccccccccccccccc/beautifulAlgorithm ## Basic Information - **Project Name**: 优雅的算法系列(连载中) - **Description**: 优雅的算法系列(连载中)面试算法题解 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2020-07-19 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 优雅的算法系列(连载中) #### 介绍 优雅的算法系列(连载中) 记录每天解决的算法题 #### 题目: ## :smiley: code_01: 之字形打印矩阵 时间复杂度为o(1) 按照之字形的方式打印这个矩阵。 **给定矩阵** ``` 1 2 3 4 5 6 7 8 9 10 11 12 ``` **返回** ``` 1 2 5 9 6 3 4 7 10 11 8 12 ``` ## :smiley: code_02: 荷兰国旗问题 以数组最后一个元素为基准,小于它的放在他的前面,等于它的放在中间,大于他的放在他的后面。 分成三部分。 ## :smiley: code_03: 给定一个有N*M的整形矩阵matrix和一个整数k,matrix的每一行和每一列都是排好序的。实现一个函数,判断k是否在matrix中。 要求时间复杂度o(M+N)空间复杂度o(1) **例如:** ``` 0 1 2 5 2 3 4 7 4 4 4 8 5 7 7 9 ``` 如果k为7则返回true;如果k为6则返回false ## :smiley: code_04: 仅用栈结构实现队列结构 ## :smiley: code_05: 仅用队列结构实现栈结构 ## :smiley: code_06: 实现一个特殊的栈,实现栈的基本功能基础上,在实现返回栈中最小元素的操作,并且复杂度为o(1) ## :smiley: code_07: 打印两个有序数组的公共部分 ## :smiley: code_08: 判断数组元素是否回文 ## :smiley: code_09: 随时找到数据流的中位数: - 题目: 有一个源源不断地吐出整数的数据流,假设你有足够的空间来保存吐出的数,请设计一个名叫MedianHolder的结构,MedianHolder可以随时取得之前吐出所有数的中位数。 - 要求如果MedianHolder已经保存了吐出的N个数,那么时刻将一个新数加入到MedianHolder的过程,其时间复杂度是O(logN)。取得已经吐出的N个整数的中位数的过程,时间复杂度为O(1) ## :smiley: code_10: 贪心策略 - 题目: 一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的 金条,不管切成长度多大的两半,都要花费20个铜板。 -群人想整分整块金条,怎么分最省铜板? - 例如,给定数组{10, 20, 30},代表一共三个人,整块金条长度为10+20+30=60. 金条要分成10, 20, 30三个部分。如果,先把长度60的金条分成10和50,花费60再把长度50的金条分成20和30,花费50-共花费110铜板。 但是如果,.先把长度60的金条分成30和30,花费60再把长度30金条分成10和20,花费30-共花费90铜板。 输入一个数组,返回分割的最小代价。 ## :smiley: code_11: **贪心策略** - 题目:输入: 参数1,正数数组costs 参数2,正数数组profits 参数3,正数k 参数4,正数m costs[i]表示i号项目的花费 profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润) k表示你不能并行、只能串行的最多做k个项目 m表示你初始的资金 - 说明:你每做完一个项目,马上获得的收益,可以支持你去做下一个项目。 - 输出: 你最后获得的最大钱数。 ## :smiley: code_12: 二叉树 - 题目: 请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时 折痕是凹下去的,即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折2 次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。 - 给定一 个输入参数N,代表纸条都从下边向上方连续对折N次,请从上到下打印所有折痕的方向。 例如:N=1时,打印: down ;N=2时,打印: down down up