主页

动态规划

一些算法举例 动态规划 Triangle 给定一个三角形数组,找到从上到下最小的sum的路径 示例: [2] [3, 4] [6, 5, 7] [4, 1, 8, 3] 最小的path sum is 11(i.e. 2+3+5+1=11) 解析 暴力法 采用递归的方式:走到最后一行最后一个元素肯定是它肩部走过来的,也就是它left肩orright肩 代码如下: /* *给定一个三角形数组,找到从上到下最小的sum的路径 *[2] *[3, 4] *[6, 5, 7] *[4, 1, 8, 3] *最小的path sum is 11(i.e. 2+3+5+1=11) */ func min...

阅读更多

杂项算法

一些算法举例 杂项 产生不重复的随机数 思路 设想一下,有n个苹果,有不同的编号,从1-n,每次拿一个出来。来产生不同的随机数 实现 func randomNumberWithoutDuplication(_ number: Int) -> [Int] { var resultArr = Array(repeating: 0, count: number) var startArr = Array(1...number) for i in 0..<startArr.count { let currentCount = UInt32(startArr.count-i) let index = Int(arc4rando...

阅读更多

树算法

一些算法举例 树 树是最常用且非常有用的数据结构之一,通过下图可以很容易理解树的概念。 上图展示的是一个拥有5个层级数的树结构。树根root是第0层,从树最外层开始每深入一层,其层级树相应的减1。 树能帮你解决很多问题,包括: 表示对象的层级关系 使查询快速高效 能提供有序的数据链 文本的前缀匹配搜索 swift构造树 class TreeNode<T> { var value: T var children: [TreeNode] = [] weak var parent: TreeNode? init(value: T) { self.value = value } ...

阅读更多

链表算法

一些算法举例 链表 合并两个排过序的链表,并将其作为新链表 示例: 输入:1->2->4,1->3->4 输出:1->1->2->3->4->4 思路: 很简单,就是链表遍历,然后变换next就可以了 代码实现: 链表构造 class Node<T> { var value: T var next: Node<T>? init(_ val: T) { self.value = val self.next = nil } } class IntLinkList { var head: Node<Int>? var tail: Node<Int>? ...

阅读更多

数组算法

一些算法举例 数组 接雨水问题 题目 leetcode-42: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水, 如下所示: 上图中,盛水量为3. 示例 输入:height = [3,1,2,4] 输出:3 思路 暴力法 每个i位置,都前后遍历,从i位置向前和向后遍历,找到前后max值较小的减去当前i位置的值就是能装的水,要是前或者后没有找到比i位置小的,那么就不能装水,复杂度为O(n2) //柱状图接水(暴力法) func getWaterByViolence(src: [Int]) -> Int { var rt ...

阅读更多

字符串算法

一些算法举例 字符串 复原IP地址 给定一个只包含数字的字符串,复原它并返回所有可能的IP地址格式。 有效的IP地址正好由四个整数(0到255之间组成),整数之间用’.’分隔。 示例 输入: "25525511135" 输出:["255.255.11.135", "255.255.111.35"] 思路 回溯法 1、一开始,字符串的长度小于 4 或者大于 12 ,一定不能拼凑出合法的 ip 地址(这一点可以一般化到中间结点的判断中,以产生剪枝行为); 2、每一个结点可以选择截取的方法只有 3 种:截 1 位、截 2 位、截 3 位,因此每一个结点可以生长出的分支最多只有 3 条分支; 根据截取出来的字符串判断是否是合理的 ip 段,这里写法比较多...

阅读更多

排序算法

一些算法举例 排序算法 首先看一张图: 这里就不多解释了,下面抽几个排序简单讲下。 成功 信息 Warning Text. Error Text. success info warning error 冒泡排序 算法步骤 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一队到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 动图演示 代码实现: func bubleSort(source: inout [Int]) -> [Int] { pri...

阅读更多

开发过程中的UI差异(flutter版)

开发过程中的UI差异(flutter版) 一个App的从无到有一定绕不开UI的还原问题,通常有设计师设计好根据时下主流的机型产出UI稿交于开发人员去还原视觉稿。比如设计稿的规范为:375(width)667(height)。通常开发人员按照设计稿设置的控件(10040)以及字体fontSize:18。但是经常会有设计师来说,怎么Android和iOS上面的表现形式不一样呢?或者怎么oppo上面的字号显得比较大呢?其实,底层逻辑都是由于物理设备到开发语言的映射差异化导致的。 原理介绍 几个名词 屏幕尺寸 屏幕尺寸(screen size),是屏幕的对角线长度,一般讲的大小单位都是英寸。 DPI (dots per inch)   dpi 是(英文Dots Per Inch)...

阅读更多