
算法与数据结构
大写的ZDQ
这个作者很懒,什么都没留下…
展开
-
归并排序算法及其优化(C++)
归并排序是时间复杂度为O(nlogn)排序算法,以下代码是归并排序的自顶向下递归完成整个归并过程的。相比插入排序,在一般情况下,插入排序时间比较久,但是在近乎有序的情况下,插入排序的时间复杂度能够有O(n),而此时归并排序反而比较慢,所以需要优化:对于arr[mid]<=arr[mid+1]的情况,不进行merge,或者对于小规模数组使用插入排序#include <iostream...原创 2019-11-20 11:27:21 · 913 阅读 · 0 评论 -
插入排序的优化(C++)
正常的插入排序和选择排序的写法如下:#include <iostream>#include <algorithm>#include "Student.h"#include "SortTestHelper.h"using namespace std;template <typename T>void insertionSort(T arr[], ...原创 2019-11-12 11:09:33 · 612 阅读 · 0 评论 -
用C++学习排序算法的一些准备工作
从一个最简单的选择排序入手,如果只是单纯的测试可以写出以下代码:void selectionSort(int arr[], int n){ for (int i=0; i < n; i++){ int minIndex = i; for(int j=i+1;j<n;j++) if(arr[j]<arr[minInd...原创 2019-11-07 11:28:46 · 250 阅读 · 0 评论 -
快速排序优化之——双路快速排序(C++)
一般我们说快速排序的数组是有序的时候,排序的时间复杂度回退滑道O(n^2),这是因为如果每次都去边上的数字作为pivot值,就会导致排序之后的不平衡,也可以说是一颗不平衡树,这里我们采取的优化策略就是需要将pivot随机生成,这样才能保证分开的数组不会那么不平衡,从而继续递归。但是还有一种情况,就是要排序的数组中重复的元素很多,这个时候当随机选取pivot的时候,发现时间复杂度又退化成了O(n^...原创 2019-11-01 11:43:14 · 1185 阅读 · 0 评论 -
Leetcode回溯算法模板
回溯算法Leetcode汇总:78.子集class Solution: def subsets(self, nums): if not nums: return [] res = [] n = len(nums) def helper(idx, temp_list): res.append(temp_list) f...原创 2019-08-24 14:48:10 · 662 阅读 · 0 评论 -
华为2019春招笔试题
1.有多组整数数组,需要将他们合并成一个新的数组,合并规则,从每个数组里按顺序取出固定长度或者已经为空,则直接取出剩余部分的内容放到新的数组中,继续下一行。第一行是读取固定长度,长度>0第2-n行是需要合并的数据,不同的数组用回车换行分隔,数组内部用逗号分隔。eg:32,5,6,7,9,5,71,7,4,3,4输出:2,5,6,1,7,4,7,9,5,3,4,7思路:按照顺序...原创 2019-04-10 20:28:38 · 1919 阅读 · 0 评论 -
数据结构——堆和堆排序(python)
本文通过堆的实现、最小堆(最大堆)、堆的时间复杂度、优先队列的实现、堆排序来介绍「 堆 」。堆的实现堆的一个经典的实现是完全二叉树(complete binary tree),这样实现的堆称为二叉堆(binary heap)。这里来说明一下满二叉树的概念与完全二叉树的概念。满二叉树:除了叶子节点,所有的节点的左右孩子都不为空,就是一棵满二叉树,如下图。可以看出:满二叉树所有的节点都拥有...原创 2019-02-13 21:03:26 · 6144 阅读 · 0 评论 -
算法之——归并排序和快速排序
归并排序归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);自下而上的迭代;和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的...原创 2019-02-08 19:50:55 · 4342 阅读 · 0 评论 -
排序算法之——选择,插入,冒泡详解(动态图+python)
选择排序插入排序冒泡排序归并排序快速排序原创 2019-02-08 16:48:03 · 3883 阅读 · 0 评论 -
数据结构之——链表
单链表链表通过将一组零散的内存块串联到一起,其中我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。把这个记录下一个结点地址的指针叫做后继指针next。有两个结点很特殊:第一个和最后一个结点。习惯吧第一个结点叫做头结点,把最后一个结点叫尾结点。头结点用来记录链表的基地址。有了他,就可以便利得到整条链表。尾结点特殊的地方是:指...原创 2019-01-31 22:52:19 · 179 阅读 · 0 评论 -
数据结构之——数组
数组是线性表,就是数据排成像一条直线一样的结构,除了数组,链表,队列,栈都是线性结构而非线性表就是二叉树,堆,图等,数据之间不是简单的先后关系。数组有连续的内存空间和相同类型的数据。正式有了这两个限制,才有了一个堪称杀手锏的特性:“随机访问”,但是删除,插入一个数据,为了保证连续性,就需要做大量的数据搬移工作。数组和链表的区别?我们时常会回答:链表适合插入,删除,时间复杂度为O(1);数组...原创 2019-01-31 21:54:22 · 3947 阅读 · 1 评论 -
Leetcode——最长上升子序列
300.给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n2) 。进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?思路:1.D...原创 2019-01-17 22:27:40 · 949 阅读 · 0 评论 -
Leetcode——乘积最大的子序列(DP)
152.给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。思路:1.暴力递归,时间复杂度很高2.DP,两步曲,首先找到状态的定义DP[i],...原创 2019-01-09 11:17:40 · 920 阅读 · 2 评论 -
leetcode——三角形最小路径的和(DP)
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[[2],[3,4],[6,5,7],[4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。说明:如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。思路:1.回溯(递归),每一层都去遍历,...原创 2019-01-06 22:16:27 · 579 阅读 · 0 评论 -
Leetcode——爬楼梯(动态规划问题)
70.爬楼梯描述假设你正在爬楼梯。需要 n 步你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例1输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 步 + 1 步2 步示例2输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1 步 + 1 步 + 1 步1 步 + 2 步2 步 +...原创 2019-01-05 10:10:32 · 1497 阅读 · 0 评论 -
leetcode——用位运算来做2的幂次方和比特位计数问题
231.给定一个整数,编写一个函数来判断它是否是 2 的幂次方。示例 1:输入: 1输出: true解释: 20 = 1示例 2:输入: 16输出: true解释: 24 = 16示例 3:输入: 218输出: false思路:可以用mod去摸运算来做,也可以用log2log_{2}log2得到int数但是最快捷的方法还是用位运算,因为不管是2的多少次方,变成二进制的...原创 2019-01-01 20:49:54 · 925 阅读 · 0 评论 -
Leetcode——x的平方根
实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842…,由于返回类型是整数,小数部分将被舍去。思路:典型的二分法问题,while循环比较目标值与中间值平方的关系,所以可以:cl...原创 2018-12-30 12:37:37 · 542 阅读 · 0 评论 -
Leetcode——生成有效括号组合
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。例如,给出 n = 3,生成结果为:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]思路:1.递归的思路,也就是深度优先搜索DFS,假设一共有2n个格子,每一个格子都有两种搜索结果,所以时间复杂度是22n2^{2n}22n,就是全部都搜索出来了。...原创 2018-12-26 10:09:50 · 2151 阅读 · 1 评论 -
Leetcode——二叉树的最小最大深度
1.给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回它的最大深度 3 。2.给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节...原创 2018-12-23 10:16:32 · 288 阅读 · 0 评论 -
leetcode——求众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。示例 1:输入: [3,2,3]输出: 3示例 2:输入: [2,2,1,1,1,2,2]输出: 2思路:1.暴力解法就是遍历两遍,第一遍x,第二遍就是count(x)数数量。时间复杂度O(N^2)2.Hash里面的map,Loo...原创 2018-12-19 10:04:04 · 278 阅读 · 0 评论 -
Leetcode——求pow(x,n)
50.Pow(x, n)实现 pow(x, n) ,即计算 x 的 n 次幂函数。示例 1:输入: 2.00000, 10输出: 1024.00000示例 2:输入: 2.10000, 3输出: 9.26100示例 3:输入: 2.00000, -2输出: 0.25000解释: 2−22^{-2}2−2 = 122\frac{1}{2^{2}}221 = 1/4 = 0.2...原创 2018-12-13 10:51:43 · 298 阅读 · 0 评论 -
LeetCode——二叉树/二叉搜索树的公共祖先
235.二叉搜索树的最近公共祖先给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] _...原创 2018-12-11 10:06:06 · 353 阅读 · 0 评论 -
Leetcode-滑动窗口的最大值_python
239.给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。返回滑动窗口最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释:滑动窗口的位置 最大值[1 3 -1] -3 ...原创 2018-11-17 15:08:08 · 1832 阅读 · 0 评论 -
时间复杂度——大O算法
算法的执行效率,就是算法代码的执行时间。我们需要能够用肉眼就看出一段代码的执行时间。int cal(int n){ int sum = 0; int i = 1; for(; i&amp;lt;=n; ++i){ sum=sum+1; } return sum;}2,3行都执行了1个unit_time的执行时间,4,5行都运行了n遍,所以是2n*unit_time的执行时间,所以...原创 2018-10-17 11:50:10 · 2421 阅读 · 0 评论 -
人生算法之快速排序
上次我们介绍了数据结构中的堆栈问题,今天来介绍一下算法。世界上有没有“最好的”算法呢?在评价“最好”之前,还是要加一些限制条件,比如是一般条件下最好,还是恶劣条件下最好。在南京三牌楼,如果要去南京站,一般情况下是要从玄武湖隧道通过的,但是如果那里发生了一些意外,基本上动都动不了的。如果选择从玄武湖公园穿过去(东西不多的话),可以在这极端情况下赶上火车。所以,世界上没有绝对的好。讲到排序,目...原创 2018-06-06 20:26:57 · 478 阅读 · 0 评论 -
堆栈从排队到跑路
有个小问题:到银行的窗口排队等候服务,到底是应该先来先服务,还是后来后服务,还是采用别的守门员这为客户服务?估计大部分人都会说,肯定是先来先服务了,嗯,我们都是讲究公平的,但是这里又有三个问题:1.首先,如果服务第一个人的时间太长,后面人等的时间就特别长,总体花的时间多,这似乎缺失了总体公平性。比如前面一个顾客遇到点情况,不记得自己的某些信息,或者要填一些复杂的表单时,这时后面的人其实都在...原创 2018-05-20 19:34:03 · 361 阅读 · 0 评论