算法与数据结构

数据结构与算法--递归(recursion)

送分小仙女□ 提交于 2020-02-24 02:02:38
递归的概念 简单的说: 递归就是方法自己调用自己 ,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。 递归调用机制 我列举两个小案例,来帮助大家理解递归 1、打印问题 2、阶乘问题 //输出什么? public static void test(int n) { if (n > 2) { test(n - 1); } System.out.println("n=" + n); } //阶乘 public static int factorial(int n) { if (n == 1) { return 1; } else { return factorial(n - 1) * n; }} 3、使用图解说明递归的调用机制 递归能解决什么样的问题 1、各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google编程大赛) 2、各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等. 3、将用栈解决的问题-->第归代码比较简洁 递归需要遵守的重要规则 1)执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 2)方法的局部变量是独立的,不会相互影响, 比如n变量 3)如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据. 4)递归 必须向退出递归的条件逼近 ,否则就是无限递归

数据结构和算法-面试题

为君一笑 提交于 2020-02-23 03:02:20
########################################## """ 数据结构: 1,用Python代码简单实现一个栈。实现pop/push及max方法,要求能在O(1)时间内取得最大值。 排序算法: 写个快速排序热热身,分析一下复杂度,如果不使用额外的空间,应该怎么写?快排平均复杂度多少,最坏情况如何优化; 请列举常见排序并通过代码实现任意三种。冒泡/选择/插入/快排 几种常用排序的算法复杂度是多少; 单向链表如何使用快速排序算法进行排序; 查找算法: 用Python实现一个二分查找的函数。 请列举常见查找并通过代码实现任意三种。无序查找/二分查找/插值查找 如何遍历一个内部未知的文件夹(两种树的优先遍历方式) 算法复杂度 手写:一个长度n的无序数字元素列表,如何求中位数,如何尽快的估算中位数,你的算法复杂度是多少; 手写:已知一个长度n的无序列表,元素均是数字,要求把所有间隔为d的组合找出来,你写的解法算法复杂度多少; list,dict和数据结构和算法 1,Python中的列表是如何实现的?Python中的列表使用了分离式技术实现的动态顺序表。 2,Python中列表的索引查询的时间复杂度是多少?O(1) 3,dict与list的查找复杂度?dict用hash实现,查找的时间复杂度是O(1),list则为O(n)。 """ ##############

数据结构与算法推荐书单

試著忘記壹切 提交于 2020-02-22 00:21:03
  对于入门的同学不建议过度追求看上去很经典的书籍,例如:《算法导论》/《算法》这些书。可以看一些相对容易看的书来入门,例如《大话数据结构》、《算法图解》。   《大话数据结构》这本书最大的特点是它将理论讲的非常有趣,不枯燥。而且每个数据结构和算法作者都结合生活中的例子进行讲解,虽然这本书有400+页,但是花两天事件读完应该是没有问题的。如果之前完全不懂数据结构和算法,可以从这本书开始。   《算法图解》和《大话数据结构》走得是同样的路线。“像小说一样有趣的算法入门书籍”,通俗易懂。它只有不到200页,所以内容比较少。看看这本书,能够让你对数据结构和算法有 个大概的认识。   入门书籍共同的问题是缺少细节,不够系统,有不够严谨。如果想系统的学习学习数据结构和算法仅靠这两本书是不够的。   《数据结构和算法分析》国内外有很多大学拿这本书当作教材。这本书非常系统/全面/严谨,而且不是特别难,适合对数据结构有一定的了解,同时至少掌握了一门编程语言的人。这本书有三个版本:《数据结构与算法分析:C语言描述》/ 《数据结构与算法分析:C++描述》/ 《数据结构与算法分析:java语言描述》。   如果你熟悉的是其它编程语言可以看一下《数据结构与算法JavaScript描述》/ 《数据结构与算法:Python语言描述》。 面试刷题宝典:   《剑指offer》这本书的作者写作目的本明确

Java数据结构与算法->递归

感情迁移 提交于 2020-02-21 11:25:26
递归 递归设计思路 1.找重复 (子问题) 2.找重复中的变化量 -> 参数 3.找参数变化趋势 -> 设计出口 换句话说就是把一个任务划一刀分成两份,自己做一部分,委托别人做另外一部分。 练习策略 1.循环改递归 2.经典递归 3.大量练习,总结规律,掌握套路 递归的定义 1.自身调用自身 public class Main { public static void main ( String [ ] args ) { function ( 10 ) ; } static void function ( int i ) { if ( i == 0 ) { //退出递归的条件 return ; } function ( i - 1 ) ; //自身调用自身 } } 练习 求n*(n-1)的阶乘 public class Main { public static void main ( String [ ] args ) { f1 ( 10 ) ; } /* * f1(n):求n的阶乘 --> 求n-1的阶乘 * 找重复:n*(n-1)的阶乘,求(n-1)是问题的重复 * 找变化:变化的量应该作为参数 * 找边界:出口 */ static int f1 ( int n ) { if ( n == 1 ) { return 1 ; //因为1的阶乘就是1 } return n * f1

数据结构与算法作业3

自闭症网瘾萝莉.ら 提交于 2020-02-21 04:28:52
Leetcod27 题目 给定一个数组nums和一个值val,你需要原地移除所有数值等于val 的元素,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1) 额外空间的条件下完成。 分析 首先,通过读题可以知道:已知:一个数组nums,一个值val。目标:将数值等于val的元素移除并返回新数组的长度。 由题意该题是要判断除数组nums中的数值等于val的元素,同时将数组中的这些元素移除。这就有点之前两次作业结合的感觉,所以干脆就用之前的想法进行编码。 解法一 首先就是暴力的都将nums中的所有元素都和val比较一下然后将不一样的都修改进nums中。 代码: class Solution { public : int removeElement ( vector < int > & nums , int val ) { int i = 0 ; for ( int j = 0 ; j < nums . size ( ) ; j ++ ) { if ( nums [ j ] != val ) { nums [ i ] = nums [ j ] ; ++ i ; } } return i ; } } ; 这就是通俗易懂的粗暴解法1.0。 解法二 在写完解法一,我突然感觉for语句以外的其他循环语句怎么样呢,于是我在微信交流群里和组员交流了一下

五分钟自学编程:怎样才能学好笔试面试最爱考察的算法

两盒软妹~` 提交于 2020-02-21 02:59:47
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 本文思维导图 什么是算法 上回我们有一篇文章,讲述了作为一个新人程序员,如何学习数据结构这门课程,其实呢,数据结构和算法是息息相关的,为什么这么说呢,因为数据结构本身只是一个载体,而在数据结构之上产生作用和输出价值的东西其实是算法。 比如数据结构里的数组,看似非常简单的数据结构,却可以支持很多复杂的算法,比如动态规划,比如DFS和BFS,再比如字符串算法、二叉树算法等等。那么算法到底是什么东西呢,不妨让我们来看看官方的介绍。 根据百度百科的介绍,算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 其实,算法的本质就是给你一组输入,运算之后给你一组输出,因此,算法帮人们解决很多问题把抽象的问题具体化,把一个问题转化成另外一个问题。 认识算法的N个阶段 我第一次遇到算法题,还是在我考研复习数据结构的时候,那个时候我看到的算法题其实都是很基础的题目,比如把数组中的两个元素置换,把两个链表合并成一个,但对于我来说已经是很有难度的事情了,那时候我连伪代码是什么都还不懂。 第二次认识算法,还是在研究生期间找实习工作的时候

数据结构与算法——作业1

ぃ、小莉子 提交于 2020-02-19 07:16:02
作业: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/two-sum 代码: nums = [ 2 , 7 , 11 , 15 ] target = 9 输入数组和目标值 n = len ( nums ) 取数组长度 for j in range ( n ) : 迭代 for i in range ( j + 1 , n ) : 题目要求不能重复使用相同元素 if ( nums [ i ] + nums [ j ] == target ) : print ( [ i , j ] ) 判断 得到结果: C : \Users\Alicerain\AppData\Local\Programs\Python\Python37\python . exe C : / Users / Alicerain / PycharmProjects / untitled5 /

数据结构笔记

回眸只為那壹抹淺笑 提交于 2020-02-17 11:29:17
目录 数据结构 二叉搜索树 线段树 动态开点 线段树的合并 线段树优化建图 做法 例题 并查集 按秩合并 二分图判定 字典树 用字典树解决异或问题(01Trie) 字符串hash 双hash 进制hash 如何得到一个字符串所有子串的hash st表 倍增 lca转换为RMQ问题 tarjan算法离线求lca 一个复杂度的证明 非旋转treap即可持久treap 数据结构 二叉搜索树 递归定义 它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。 •维护一个集合,支持操作:插入、删除、查找 •方法:建立一棵有序的二叉树,每个结点对应集合中一个元素。 •满足性质:结点u的左子树的结点权值都比u小,右子树的结点权值都比u大。 •插入、删除、查找只需在二叉树中按照权值往下走即可。 可能的问题: 可能退化成一条链(例如如果按升序插入),那么每次操作平均复杂度O(n)需要一些技巧让二叉搜索树保持平衡。STL中的set和map都是平衡的二叉搜索树。noip一般情况下够用。 线段树 护区间信息的数据结构 每个结点对应一个序列的区间 完全二叉树,左子树为左一半区间,右子树为右一半 单点/区间修改。 动态开点 例题 维护一个数据结构

Java数据结构与算法3 链表

心已入冬 提交于 2020-02-17 01:42:08
链表思想 链表是以节点的方式进行存储 每个节点包含两个域:data+next:指向下一个节点 链表的各个节点并不一定是连续存储的 链表分为带头节点的链表和不带头节点的链表,根据实际需求来选择 我们以水浒英雄好汉的排名来解释链表结构在Java中的实现 class HeroNode { int id ; String name ; Hero next ; } 每个英雄节点包含一个id,一个姓名(data域) 和指向下一个节点的引用next. 单链表-英雄好汉 现在我们有一个需求,就是向单链表中添加多个英雄好汉的节点。 添加节点思想:先创建一个head头节点,表示单链表的头 (case 1)每添加一个节点,添加到单链表的最后 找到最后一个节点,将最后节点的next指向 新的节点 (case 2)按排名添加到链表对应位置,如果该位置已经被占用,则返回错误信息 通过辅助节点找到新添加的节点的位置(遍历) 新的节点.next = temp.next temp.next = 新的节点 遍历链表思想:通过一个辅助变量来遍历整个单链表 删除节点思想:先找到要删除节点的前一个节点temp,temp.next = temp.next.next; 被删除的节点将不会有其他引用指向,会被垃圾回收。 查找单链表中倒数第K个节点(新浪) 1)编写一个方法,接受head参数+k参数 2)先遍历整个列表

【数据结构】树

我的未来我决定 提交于 2020-02-16 18:28:58
树 客观世界中许多事物存在层次关系 eg:人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率 查找(Searching):给定某个关键字K,从集合R中找出关键字与K相同的记录 静态查找:集合中记录是固定的 没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的 除查找,还可能发生查找和删除 静态查找 顺序查找 typedef struct LNode *List; struct LNode{ ElementType Element[MAXSIZE]; int Length; } int SequentialSearch(List Tb1, ElementType K){ int i; Tb1->Element[0]=K;//哨兵!这样可以减少判断 for(i=Tb1->Length;Tb1->Element[i]!=K;i--); return i; } 二分查找 Binary Search O(log(n)) 假设n个数据元素的关键字满足有序 \(k_1<k_2<k_3<...<k_n\) ,并且是连续存放(数组),那么可以进行二分查找。 typedef LNode *List; struct LNode{ ElementType Element[MAXSIZE]; int Length; } int BinarySearch(List PtrL