
算法
世态炎凉!!
谢谢你的关注!
展开
-
一些经典排序算法及复杂度分析(图文分析)
排序是一个比较基础的问题,所以排序算法的种类也比较多!下面我介绍下一些比较经典的排序算法及原理和复杂度分析!一 、冒泡排序冒泡排序就是重复“从序列右边开始比较相邻两个数字的大小(一定是相邻的两个数字),再根据结果交换两个数字的位置”这一操作的算法。在这个过程中,数字会像泡泡一样,慢慢从右往左“浮”到序列的顶端,因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样所以这个算法才被称为“冒泡排序”。当然你从左往右比较相邻两个数字的大小也是可以原创 2020-12-25 12:00:01 · 4737 阅读 · 0 评论 -
神奇的异或运算符
异或运算符,估计平时可能用的比较少(本人基本没用过!),下面介绍下异或运算符的原理及使用,异或运算有以下几个特点:一个数和 0 做 XOR 运算等于本身:a⊕0 = a一个数和其本身做 XOR 运算等于 0:a⊕a = 0XOR 运算满足交换律和结合律:a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b为什么 a⊕0 = a?看下图:为什么 a⊕a = 0?为什么 a⊕b⊕a = b?下面来看一道算法题!给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两原创 2020-12-08 12:04:54 · 400 阅读 · 0 评论 -
两数组的交集(多种方法)
给定两个数组,编写一个函数来计算它们的交集示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。这题比较简单,有很多种方法和思路!如果你觉得自己会了,就不需要往下看了!下面我们介绍下一些常用的思路和方法并加于分析!遍历循环直观的方法是遍历数组 nums1,对于其中原创 2020-12-05 14:05:49 · 18082 阅读 · 1 评论 -
旋转数组(数组右移)
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例 1:输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例 2:输入: [-1,-100,3,99] 和 k = 2输出: [3,99,-1,-100]解释:向右旋转 1 步: [99,-1,-100,3]原创 2020-12-03 14:54:03 · 335 阅读 · 0 评论 -
利用双指针删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。实例一:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。实例二给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度 5, 并且原数组 nums 的前五个元素原创 2020-12-02 16:34:25 · 486 阅读 · 0 评论 -
找出二叉树所有路径(多种方法)
如标题所示,需要找出二叉树的所有的路径!看下图:上图是一个完全二叉树!找出此树的所有的路径!我们来试着想下常用的方法? 首先深度优先遍历(可以用递归,也可以用栈的思想),也可以用广度优先遍历(也可以用队列的思想),那么我们来试下每种方法的实现!下面是模拟的测试数据!模拟的数据:```javascriptlet tree = { "val": 1, "left": { "val": 2, "left": { "val": 4,原创 2020-11-28 18:36:36 · 6590 阅读 · 0 评论 -
二叉树的深度优先遍历前序中序后续遍历
上篇文件已经讲解了什么是二叉树?二叉树的特点!今天我们要说下二叉树的几种常见的遍历!话不多说,直接进入正题!以下图为例子!图1一.前序遍历所谓前序,是指得根结点靠前,然后在是左节点,再右节点! 根结点→\rightarrow→左节点→\rightarrow→右节点,看图1的二叉树,前序排序的顺序为 1→\rightarrow→ 2 →\rightarrow→ 4 →\rightarrow→ 3 →\rightarrow→ 6 →\rightarrow→ 7,那么我们应该怎么实现呢?实现的方式有原创 2020-11-26 14:06:35 · 2185 阅读 · 0 评论 -
浅谈树、二叉树、满二叉树、完全二叉树
一.树树结构是一种非线性储存结构(数据元素之间存在一对一的线性关系),存储的是具有“一对多”关系的数据元素的集合!图1图1就是一个树结构!图1是使用树结构存储的集合 {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} 的示意图。对于数据 1 来说,和数据2、3 有关系;对于数据 4 来说,和 8、9 有关系。这就是“一对多”的关系。将具有“一对多”关系的集合中的数据元素按照上图的形式进行存储,整个存储形状在逻辑结构上看,类似于实际生活中倒着的树(图2倒过来),所以称这原创 2020-11-17 17:17:34 · 3850 阅读 · 0 评论 -
浅谈广度优先和深度优先遍历(栈和队列)
1.什么是深度优先和广度优先?其实简单来说 深度优先就是自上而下的遍历搜索,上图深度优先顺序为 (root–a--c–h--i–d--g–k--b–e--l–m--f–n--o), 广度优先则是逐层遍历,上图广度优先顺序为 (root–a--b–c--d–e--f–h--i–g--k–l--m–n--o)!很好理解就不说了!2.原理及如何实现?先上一段代码!let nodes = { "value": "root", "child": [{ "value": "a"原创 2020-11-14 18:22:08 · 10320 阅读 · 0 评论 -
快速排序原理和实现(图文讲解)
快速排序是一种常用的排序算法,快速排序也使用了分而治之(divide /dɪˈvaɪd/ and conquer /ˈkɒŋkər/ 简称D&C)。分而治之是一种思路,它是一种递归思想,每个递归函数都有两部分:基线条件(base case)递归条件(recursive case) /rɪˈkɜːsɪv/递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。function fibonacci(n) { if (n <=2) { //原创 2020-11-12 15:21:14 · 5155 阅读 · 0 评论 -
二分查找(算法)
如题,二分查找只是针对有序数组中查找特定元素的搜索一种算法!二分查找很好写,却很难写对,下面我来一一介绍下二分查找和二分查找的变种!1.原理在一个有序的数组中,平分数组,取到中间值(x),这时数组已经被这个x分割成两部分left和right,[left,x,right],用值(n)和这个中间(x)做对比!(如果比x大,那目标就缩小到right这部分,然后继续平分right数组,取到中间值(x1),这时数组已经被这个x分割成两部分left1和right1,[left1,x1,right1],接着比较这个值原创 2020-11-06 14:12:03 · 1594 阅读 · 0 评论 -
数组和链表的区别?
今天来说下两种最基本的数据结构——数组和链表,它们无处不在!下面我们来一一介绍下他们,首先了解下内存分配的!内存的工作原理假设你去看演出,需要将东西寄存。寄存处有一个柜子,柜子有很多抽屉。每个抽屉可放一样东西,你有两样东西要寄存,因此要了两个抽屉。现在你可以去看演出了!这大致就是计算机内存的工作原理。计算机就像是很多抽屉的集合体,每个抽屉都有地址。fe0ffeeb是一个内存单元的地址。需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存储多项数据时,有两种基本方式原创 2020-10-31 19:25:23 · 3654 阅读 · 1 评论 -
算法的时间复杂度(大O表示法)
首先我们先来看个例子,我想找个1~100的数字`,你的目标是以最少的次数猜到这个数字。你每次猜测后,我会说小了、大了或对了。下面我们来看下两种简单的方法(方法有很多种),再来引入算法的运行时间!``方法一(循环遍历):假设你从1开始依次往上猜,猜测过程会是这样!这是简单查找,更准确的说法是傻找。每次猜测都只能排除一个数字。如果我想的数字是99,你得猜99次才能猜到!方法二(二分查找):(如果我想的数字是99)首先从100中 找到中间的值50,然后和50比较,小了?继续找中间值75,和75比较,原创 2020-10-31 16:44:50 · 3706 阅读 · 2 评论 -
简单的递归算法
最新总是搞些配置工作,搞的很心烦,有些配置,要是个个都人手去配置的话,要配死人,所以有些时候需要自己写些简单的算法去生成程序!来看下我们的要求,先上张图这个是接口的请求体的数据,但是我红框标出的clazz类名全部要改,改成下图中的value值(短名改长名)要是我一个个手工去找,手动去配,2万多行代码我得改多久?我真的很无语会有这样的工作,没办法只能自己写个程序!思路是分二种情况,第一种情况如果是对象或者是数组,遍历对象,然后做递归,另外一种情况是字符串,然后去找有没有这个clazz类的长名,没有的话原创 2020-10-21 15:17:34 · 180 阅读 · 0 评论 -
寻找数组的中心索引
平时写项目时,碰到算法相关问题,都要思考许久,所以从现在开始坚持学习算法,从易到难!主要目的学习算法的思路!今天看下怎么寻找一个数组的中心索引,看下面示例示例 1:输入:nums = [1, 7, 3, 6, 5, 6]输出:3解释:索引 3 (nums[3] = 6) 的左侧数之和 (1 + 7 + 3 = 11),与右侧数之和 (5 + 6 = 11) 相等。同时, 3 也是第一个符合要求的中心索引。示例 2:输入:nums = [1, 2, 3]输出:-1解释:数组中不原创 2020-10-16 16:32:54 · 630 阅读 · 0 评论