
数据结构&算法
文章平均质量分 96
工作学习总结
zfpp25_
iOS
展开
-
合并两个有序数组,且合并后有序,同时去重
一、算法方案两个指针分别指向两个数组,当其中一个小于另外一个就移动该指针,反之则移动另外一个指针 如果相等则均向后移动. 结束条件是,当任意一个数组的指针移到末尾则跳出循环 把另外一个数组没有比较完的部分直接放到新数组里二、代码实现func mergeSortedArray(_ a: [Int], b:[Int]) ->[Int] { var i = 0 var j = 0 var ans = [Int]() //合并数组原创 2020-09-15 15:19:05 · 924 阅读 · 0 评论 -
二叉树的最近公共祖先
一、算法方案1、 如果结点 p、q 都存在且为左右结点,那么根结点 root 就是最近公共祖先;2、 如果结点 p、q 都存在且都为左结点,那么在根结点 root 的左子树查找;3、 如果结点 p、q 都存在且都为右结点,那么在根结点 root 的右子树查找。二、代码实现/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left;原创 2020-09-15 14:46:47 · 134 阅读 · 0 评论 -
二叉树的深度
一、算法方案考虑以下几种情况:如果是空的二叉树,深度为0;只有根节点,深度为1;根节点只有左子树,深度为左子树的深度加1;根节点只有右子树,深度为右子树的深度加1;根节点既有左子树又有右子树,深度为取左右子树深度的最大者再加1。二、代码实现int maxDepth(struct TreeNode* root){ if (root == NULL) { return 0; } int lenLeft = maxDepth(root->l原创 2020-09-15 14:32:05 · 941 阅读 · 0 评论 -
单链表翻转
一、算法方案p指向第一个有效节点,头指针headpointer的指针域为空,p逐个后移,并将p指向的当前元素以头插的方式插入到头指针二、代码实现/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */int add_node_head(struct ListNode* head, struct ListNode*原创 2020-09-15 14:17:20 · 96 阅读 · 0 评论 -
单链表是否相交
方法一: 暴力法对链表A中的每一个结点遍历,然后遍历整个链表B,并检查链表B中是否存在结点相同。复杂度分析时间复杂度 :(mn)(mn)。 空间复杂度 :O(1)O(1)。方法二:哈希表法遍历链表 A 并将每个结点的地址/引用存储在哈希表中。然后检查链表 B 中的每一个结点是否在哈希表中。若在,则为相交结点。复杂度分析时间复杂度 :O(m+n)O(m+n)。 空间复杂度 :O(m)O(m)或O(n)O(n)。方法三:双指针法创建两个指针pA和pB...原创 2020-09-15 14:03:57 · 192 阅读 · 0 评论 -
单向链表是否有环
一、算法方案1、快慢双指针法,快指针一次走两步,慢指针一次走一步,如果有环必会相遇2、集合法二、代码实现1、快慢双指针法//swift实现 public class ListNode { public var val: Int public var next: ListNode? public init(_ val: Int) { self.val = val self.next = nil } }f原创 2020-09-15 13:24:12 · 202 阅读 · 0 评论 -
细聊二分查找算法
1、二分法(数学领域术语)对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。二分法(Bisection method) 即一分为二的方法. 设[a,b]为R的闭区间. 逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的中点.原创 2020-09-15 09:58:29 · 994 阅读 · 0 评论 -
算法~十大经典排序算法
一、八大排序算法二、栈&队列三、字符串处理四、链表五、二叉树相关操作六、深搜广搜七、基本的动态规划题、贪心算法、二分查找...原创 2020-09-14 16:30:38 · 556 阅读 · 0 评论 -
算法(5)哈希表
1.0 问题描述实现数据结构:哈希表。2.0 问题分析哈希表可以看作我们经常使用的字典(swift)或对象(js),可以让一个key&value对一一对应,可以快速根据key找到value。 哈希表内部使用数组实现,我们需要将不论任何类型的key计算出与之一一对应的数字来,数字的大小介于0到数组尺寸之间,这样,我们可以把value直接存储到数组的对应位置。 通过key计算出唯一数字的过程,叫做哈希函数。同一个key每次通过hash函数生成的数字都是相同的。 由于不同的key可能会生原创 2020-08-26 09:31:07 · 233 阅读 · 0 评论 -
算法(4)数据结构:堆
1.0 问题描述实现数据结构:堆。2.0 问题分析堆一般使用数组来表示,其中某个节点下标i的两个子节点的下标为 2i+1 和 2i+2。堆是一棵完全二叉树。 堆有3种基本操作:创建,插入,删除。 这3种操作都需要通过“调整堆”的方式来实现。调整堆是指,对堆中的某个节点,若它的值和它所有子节点相比,不是最大/最小,那么就需要将最大/最小的元素和当前节点交换,这种操作成为“调整堆”。 创建可以用插入来实现(复杂度O(nlogn)),也可以使用数组直接转换成堆(复杂度O(n))。 假设数组长度原创 2020-08-26 09:31:18 · 105 阅读 · 0 评论 -
算法(3)简单四则运算
1.0 问题描述实现10以内四则运算(只包含数字,±*/和小括号)2.0 问题分析四则运算使用“后缀表达式”算法来计算,后缀表达式可以无需考虑运算符优先级,直接从左至右依次计算。 问题分解成2部分,一是将“中缀表达式”(我们正常写的四则运算字符串样式,即我们的输入表达式)转为“后缀表达式”;二是使用“后缀表达式”求值。 “中缀表达式”转“后缀表达式”流程: 首先建立一个栈和一个队列,分别为“符号栈”和“结果队列”:“符号栈”用于保存符号,处理符号优先级;“结果队列”用于保存“后缀表达式”原创 2020-08-25 14:10:26 · 390 阅读 · 0 评论 -
算法(2)KMP算法
1.0 问题描述实现KMP算法查找字符串。2.0 问题分析“KMP算法”是对字符串查找“简单算法”的优化。 字符串查找“简单算法”是源字符串每个字符分别使用匹配串进行匹配,一旦失配,模式串下标归0,源字符串下标加1。 可以很容易计算字符串查找“简单算法”的时间复杂度为O(m*n),其中n表示源字符串长度,m表示匹配串长度。 KMP算法的匹配方式同简单算法的匹配方式相同,只不过在失配的时候,模式串下标不归零,反而会根据模式串自身的重复信息,回归到一个大于0的下标。从而减少匹配次数。 那么失原创 2020-08-25 14:08:54 · 186 阅读 · 0 评论 -
有趣的斐波那契数列
1.0 问题描述实现斐波那契数列,求第N项的值2.0 问题分析斐波那契数列最简单的方法是使用递归,递归和查表法同时使用,可以降低复杂度。 根据数列特点,同时进行计算的数值其实只有3个,所以可以使用3个变量循环递进计算结果。 3个变量可以简化为2个变量。3.0 代码实现3.1使用swift实现func fbnq(_ n: Int) -> UInt64{ if n < 0 || n > 92 { return 0; } var原创 2020-08-25 14:07:34 · 433 阅读 · 0 评论