脚本之家(jb51.cc)算法栏目主要收集统计算法、大数据算法等资料。
用C++语言实现选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排
一、题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 1.必须
链表是面试中最常见的一种题型,因为他的每个题的代码短,短短的几行代码就可以体现出应聘者的编码能力,所以它也就成为了面试的重点。 链表常见的操作有1.打印链表的公共部分,2.删除链表的倒数第K个节点,3
备注:这里使用的插入排序和选择排序都是经过优化后的详细优化请查看上一条博客,编译器使用DEV-C++ 冒泡排序算法的运作如下:(从后往前) 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
测试环境为DEV-C++,并且选择排序,插入排序,冒泡排序,均为优化后的,若想了解具体优化过程,请参照:https://blog.csdn.net/qq_40164152 测试用例: 选择排序:基本思
我们通常所说的堆是指二叉堆,二叉堆又称完全二叉树或者叫近似完全二叉树。二叉堆又分为最大堆和最小堆。 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数
插入排序第一种:交换法| 8 | 6 | 3 | 2 | 10 | 9 | 11 | 4 | 5 |第一个元素就不需要考虑了,直接看第二个元素6,因为6<8,所以6与8交换位置得到:| 6 |
题目:一个小猴子边上有100根香蕉,它要走过50米才能到家,每次它最多搬50根香蕉,(多了就被压死了) , 它每走1米就要吃掉一根,请问它最多能把多少根香蕉搬回家里? 分析: 当然了这个题按平时的思想
数组中重复的数:题目:找出数组中重复的数,题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任
备注:本文参照《剑指offer第二版》 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数, 输入这样的一个二维数组和一个整数,判断数组中
分治算法(Divide And Conquer)是解决规模庞大的问题的很好的思路,它通过降低问题的规模,形成若干个规模更小但形式相同的子问题,进行递归求解。在求解过后,将各个子问题的解合并起来,形成原
回溯算法本质就是枚举,在给定的枚举集合中不断从其中尝试搜索找到问题的解,如果在搜索过程中发现不满足求解条件,则回溯返回,尝试其他路径继续搜索解决,这种走不通就回退再尝试其他路径的方法就是回溯法。解决一
动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。整体框架:状态转移方程、备忘录存储重复子问题、最小子问题、求最值。斐波那契数列不算动态规划,但是
有N件物品和一个容量为V的背包。第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。状态转换方程:“f[i][v]=max{f[i-1][v],f[i-1][v-c[i
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。遍历
滑动窗口算法可以用以解决数组/字符串的子元素问题,它可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度。
递归 **递归实现的原理:**对于递归的问题,我们一般都是从上往下递归的,直到递归到最底,再一层一层着把值返回。 一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函
回溯法 对于回溯法,网上有很多种解释,这里我依照自己的(死宅)观点做了以下三种通俗易懂的解释: **正经版解释:**其实人生就像一颗充满了分支的n叉树,你的每一个选择都会使你走向不同的路线,获得不同的
动态规划 动态规划(dynamic programming):它是把研究的问题分成若干个阶段,且在每一个阶段都要“动态地”做出决策,从而使整个阶段都要取得最优效果。 理解:其实,无非就是利用历史记录,
| |分治算法 |贪心算法 |动态规划 |回溯法 | | | | | | | |问题类型 |通用问题 |优化问题 |优化问题 |通用问题 | |子问题结构 |独立,类型相同 |只考虑当前子问题 |子问
本文转自labuladong的算法小抄 , 代码部分我使用go重新描述 先给大家讲个笑话乐呵一下: 有一天阿东到图书馆借了 N 本书,出图书馆的时候,警报响了,于是保安把阿东拦下,要检查一下哪本书没有
转载自labuladong的算法小抄,go语言描述 反转单链表的迭代实现不是一个困难的事情,但是递归实现就有点难度了,如果再加一点难度,让你仅仅反转单链表中的一部分,你是否能够递归实现呢? 本文就来由
摘自labuladong算法小抄,使用go语言重新描述 之前的文章「递归反转链表的一部分」讲了如何递归地反转一部分链表,有读者就问如何迭代地反转链表,这篇文章解决的问题也需要反转链表的函数,我们不妨就
总结: 两数之和——哈希表:时间复杂度O(n),暴力解法O(n^2) 三数之和——双指针:一层i的for循环,双指针left和right。时间复杂度O(n^2),暴力解法O(n^3) 四数之后——双指
对于让你求二叉树节点个数的题目,无非就是普通二叉树、完全二叉树、满二叉树三种。这三者的关系是,二叉树>完全二叉树>满二叉树。 如果是题目没有给限定条件,只让你求二叉树的节点个数,则按照普通
分治思想求解的问题,但是比较特殊,只有分解问题和求解小问题,不需要合并 每次也只需要经过判断,分解一半,所以比其他分解两边的效率高 最坏情况时间复杂度为O(n^2),期望时间复杂度为O(n) 找基准值
性能分析: 时间复杂度:O(n^2) 空间复杂度:O(1) #include<iostream> #include<vector> using namespace std; i
1.链表中环的入口节点 首先判断头指针是不是空的然后需要判断这个链表中包不包含环:两个指针,一个一步一个两部,如果相遇,说明存在然后判断环节点的个数:从相遇的位置开始,往前走并计数,直到和自己再次相遇
还是分治的思想,解决方法利用了归并排序。具体可以看一下这篇博客。 第三章:分治II - 不妨不妨,来日方长 - 博客园 (cnblogs.com) C++代码如下,可以在VS直接运行。 #includ
二叉树的问题,一定要明白到底应该深度优先(前中后序)还是广度优先(层序遍历) 最基本的遍历方式:深度优先和广度优先 深度优先:前、中、后序(递归法和迭代法均可) 广度优先:层次遍历(迭代法) 栈其实就