数据结构和算法
文章平均质量分 60
zpznba
日日行,不怕千万里。常常做,不怕千万事。
展开
-
【程序员面试金典】用C语言实现reverse字符串反转函数
1 #include<stdio.h> 2 3 void reverse(char *str){ 4 char temp; 5 char* end = str; 6 if(str){//找到字符串的结尾位置 7 while(*end != '\0') 8 ++end; 9 }...原创 2019-07-13 21:54:32 · 2280 阅读 · 0 评论 -
leetcode 77 组合
给定两个整数n和k,返回 1 ...n中所有可能的k个数的组合。示例:输入:n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4],]【分析】全排列,部分排列这些问题都是回溯的题目。只不过有些题目的解空间需要判断,有些的不需要。这道题的解空间是当长度等于k的大小时就是一个解,可以...原创 2019-03-31 21:51:17 · 122 阅读 · 0 评论 -
leetcode 174:地下城游戏
【分析】这道题一看就是动态规划,最开始从左上角往右下走,每次判断右侧和下侧哪个数大就走哪个方向,但是这样想的话就会有一个问题,就是我们需要判断每次到达一个房间后,我们的血量不能是负数。而问题的关键是骑士的初始值是未知量!!比如上面这个例子,如果按照这个策略最后得到的就是28,不是7。因此我们换个角度,从下往上倒退。状态定义:f(x, y) -------- 到达坐标(x, y)前骑士所...原创 2019-04-10 11:20:30 · 451 阅读 · 0 评论 -
leetcode 51 N皇后
n皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数n,返回所有不同的n皇后问题的解决方案。每一种解法包含一个明确的n皇后问题的棋子放置方案,该方案中'Q'和'.'分别代表了皇后和空位。示例:输入: 4输出: [ [".Q..", // 解法 1 "...Q...原创 2019-03-31 16:51:58 · 81 阅读 · 0 评论 -
回溯法与N皇后问题
回溯法回溯法是用来解决这样的问题:在相对于问题的输入规模按照指数速度增长的域中,找出一个具有指定特性的元素,如在图顶点的所有排列中求一个哈密顿回路,或者背包问题。回溯法实际上是对穷举查找的优化。它通过对所做的选择构造一颗所为的空间状态树来实现。具体来说,树的根节点表示在查找前的初始状态,树的第一层节点表示对解得第一个分量做的选择,以此类推。如果一个部分的构造解仍然有可能导致一个完整解,我...原创 2019-03-31 15:48:06 · 6859 阅读 · 1 评论 -
二分查找(C++)
二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,具有很大的应用场景,而在LeetCode中,要运用二分搜索法来解的题目也有很多,但是实际上二分查找法的查找目标有很多种,而且在细节写法也有一些变化。根据查找的目标不同,二分查找法主要分为以下三类:第一类: 需查找和目标值完全相等的数这是最简单的一类,也是我们最开始学二分查找法需要解决的问题,比如我们...原创 2019-02-16 21:07:50 · 6615 阅读 · 1 评论 -
leetcode 767. 重构字符串
给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。若可行,输出任意可行的结果。若不可行,返回空字符串。示例1:输入: S = "aab"输出: "aba"示例 2:输入: S = "aaab"输出: ""【思路】这道题给了我们一个字符串,让我们重构这个字符串,使得相同的字符不会相邻,如果无法做到,那么就返回空串,题目中的例子很好的说明了...原创 2019-03-18 15:47:13 · 416 阅读 · 0 评论 -
哈希表原理和哈希冲突
假设有一个数组An= {81, 62, 55, 43, 97, 76, 49, 98, 64}; 如果判断任意一个数x是否在该给定的数列An中呢? 作为一个正常的人, 我们自然会想, 把x先和81, 62, ..., 逐一比较,这样复杂度是O(n)。提出哈希表的人, 确实很了不起, 因为他没有采用正常人的思路。我们来看看哈希表人的思路:哈希的思想是:你给我一个key和value...原创 2019-03-25 11:50:59 · 520 阅读 · 0 评论 -
各大排序算法C++代码实现
排序算法分类排序算法比较表格注:1 归并排序可以通过手摇算法将空间复杂度降到O(1),但是时间复杂度会提高。2 基数排序时间复杂度为O(N*M),其中N为数据个数,M为数据位数。辅助记忆---- 时间复杂度记忆-冒泡、选择、直接 排序需要两个for循环,每次只关注一个元素,平均时间复杂度为O()O()(一遍找元素O(n)O(n),一遍找位置O(n)O(n)...原创 2019-03-12 20:43:01 · 517 阅读 · 0 评论 -
leetcode 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-2 = 1/22 = 1/4 = 0.25说明:-100.0 <x< 1...原创 2019-04-06 12:29:51 · 94 阅读 · 0 评论 -
LeetCode 39 组合总和
给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的数字可以无限制重复被选取。说明:所有数字(包括target)都是正整数。 解集不能包含重复的组合。示例1:输入: candidates = [2,3,6,7], target = 7,所求解集为...原创 2019-04-07 10:39:49 · 102 阅读 · 0 评论 -
字符串转换成整数
题目描述输入一个由数字组成的字符串,把它转换成整数并输出。例如:输入字符串"123",输出整数123。给定函数原型int StrToInt(const char *str),实现字符串转换成整数的功能,不能使用库函数atoi。分析与解法本题考查的实际上就是字符串转换成整数的问题,或者说是要你自行实现atoi函数。那如何实现把表示整数的字符串正确地转换成整数呢?以"123"作为例子...原创 2019-05-23 15:42:14 · 2736 阅读 · 0 评论 -
二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。【思路】从右上角开始,如果小于目标往下走,大于目标往左走,直到超出矩阵范围或者找到为止。class Solution {public: bool Find(int target...原创 2019-04-30 11:38:23 · 75 阅读 · 0 评论 -
堆的各种操作实现及分析
堆是一棵完全二叉树,使用数组实现堆,堆分为两种:最大堆:父节点大于任意子节点(因此堆顶为最大值) 最小堆:父节点小于任意子节点(因此堆顶为最小值)对于第i个节点(i从0开始计数):父节点:(i-1)/2 左子节点:2i+1 右子节点:2i+2若包含sz个节点,则第一个非叶子节点的序号为(sz - 2) / 2插入节点插入节点时,进行下列操作:将元素K添加到最后一个...原创 2019-04-12 17:34:03 · 447 阅读 · 0 评论 -
Leetcode 198. 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃...原创 2019-04-12 15:02:49 · 106 阅读 · 0 评论 -
红黑树(RB-tree)比AVL树的优势在哪?
今天看了STL源码剖析中关于红黑树的原理和实现,看完复杂的节点插入、节点颜色变换后不禁想:这些功能经典的AVL树也能实现,为什么要提出红黑树?查了些资料,并且加上自己理解,感叹红黑树的巧妙。首先红黑树是不符合AVL树的平衡条件的,即每个节点的左子树和右子树的高度最多差1的二叉查找树。但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决...转载 2019-04-09 09:44:36 · 150 阅读 · 0 评论 -
leetcode 784 字母大小写全排列
给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。示例:输入: S = "a1b2"输出: ["a1b2", "a1B2", "A1b2", "A1B2"]输入: S = "3z4"输出: ["3z4", "3Z4"]输入: S = "12345"输出: ["12345"]注意:S的长度不超过12。...原创 2019-04-02 13:16:46 · 265 阅读 · 0 评论 -
LeetCode 673. 最长递增子序列的个数
给定一个未排序的整数数组,找到最长递增子序列的个数。示例 1:输入: [1,3,5,4,7]输出: 2解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。示例 2:输入: [2,2,2,2,2]输出: 5解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。注意:给定的数组长度不超过 2000 并且...原创 2019-04-11 11:07:45 · 620 阅读 · 0 评论 -
30张图带你搞懂红黑树
这篇红黑树的讲解比较好懂,这里直接转过来。转载自:https://www.jianshu.com/p/e136ec79235c当在10亿数据中只需要进行10几次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀! —— 学红黑树有感。终于,在学习了几天的红黑树相关的知识后,我想把我所学所想和所感分享给大家。红黑树是一种比较难的数据结构,要完全搞懂非常耗时耗力,红黑树怎么自平衡?什么...转载 2019-04-07 15:30:31 · 375 阅读 · 0 评论 -
希尔排序C++实现
shell排序在不相邻的元素之间比较和交换。利用了插入排序的最佳时间代价特性,它试图将待排序序列变成基本有序的,然后再用插入排序来完成排序工作。在执行每一次循环时,Shell排序把序列分为互不相连的子序列,并使各个子序列中的元素在整个数组中的间距相同,每个子序列用插入排序进行排序。1.举例说明希尔排序法过程以一个整数序列为例来说明{12,45,90,1,34,87,-3,822,23,...原创 2019-03-11 22:23:59 · 16719 阅读 · 2 评论 -
C++堆排序实现
更详细易懂的文章请参考最新博客:https://blog.csdn.net/zpznba/article/details/89242038整个堆排序过程中, 我们只需重复做两件事:建堆(初始化+调整堆, 时间复杂度为O(n));拿堆的根节点和最后一个节点交换(siftdown, 时间复杂度为O(n*log n) ).因而堆排序整体的时间复杂度为O(n*log n).下面通过...原创 2019-03-11 16:49:03 · 159 阅读 · 0 评论 -
归并排序的迭代实现
之前在另一篇文章中C++ 归并排序与快速排序详细分析了归并排序的递归实现,但是会占用大量的时间和空间,算法的效率低下;使用迭代的方式代替递归的方式虽然比较难想,但是会增大效率。如何写迭代?根据上面的图,我们可以先把数组划分为n组,刚开始每组只有一个值。然后相邻的小组不断进行两两合并,最终合并成为一个组。可以用一个变量来枚举步长1,2,4,……,对由每个步长分开的区间,都合并一下。...原创 2019-03-11 16:05:14 · 4995 阅读 · 1 评论 -
leetcode 155 最小栈
如果用一个变量来存最小值的话,push和getmin操作都是O(1),但是pop()操作就是O(n)了,因为有可能正好把最小的元素pop出去了,这个时候要重新找出最小元素,则需要遍历栈中的元素。这个时候只能用空间换时间的思路:【思路一】用一个辅助栈Smin,每次push的时候,如果当前元素<=Smin的栈顶元素则,让其入Smin;pop()的时候,当要弹出的栈顶元素 == Smin的...原创 2018-10-17 22:24:34 · 130 阅读 · 0 评论 -
基本插入排序的实现(C++)
#include <iostream>using namespace std;void print(int a[], int n ,int i){ cout<<i <<":"; for(int j= 0; j<8; j++){ cout<<a[j] <<" "; }原创 2018-11-02 15:34:18 · 122 阅读 · 0 评论 -
C++选择排序实现
#include <iostream>#include<string>using namespace std;void print(int a[], int n ,int i){ cout<<i <<":"; for(int j= 0; j<8; j++){ cout<<a[j] <原创 2018-11-04 20:28:51 · 129 阅读 · 0 评论 -
C++ 归并排序与快速排序
归并排序:【算法逻辑】归并的思路(分治)是把一个大问题a拆解成两个小问题b和c,解决了两个子问题再整合一下,就解决了原问题。用递归的方法,先分解再合并(分治是一种解决问题的处理思想,递归是一种编程技巧,这两者并不冲突):【代码实现】#include<iostream>using namespace std;void Merge(int arr[], in...原创 2018-11-05 15:15:31 · 27912 阅读 · 8 评论 -
Leetcode24 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。示例:给定 1->2->3->4, 你应该返回 2->1->4->3说明:你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 【解题思路】要交换两个节点,首先需要两个指针指向这两个节点。其次因为头结点可能会发生变动,因此这...原创 2018-11-09 21:40:01 · 121 阅读 · 0 评论 -
【数据结构--Heap】堆&&C++中的priority_queue
堆(英语:Heap)是计算机科学中的一种特别的树状数据结构。若是满足以下特性,即可称为堆:“给定堆中任意节点 P 和 C,若 P 是 C 的母节点,那么 P 的值会小于等于(或大于等于) C 的值”。若母节点的值恒小于等于子节点的值,此堆称为最小堆(英语:min heap);反之,若母节点的值恒大于等于子节点的值,此堆称为最大堆(英语:max heap)。在堆中最顶端的那一个节点,称作根节点(英...原创 2018-11-13 09:31:45 · 333 阅读 · 0 评论 -
关于一致性哈希算法
假设我们有 K 个机器,数据的哈希值的范围为 [0, MAX]。我们将整个范围划分为 m 个小区间(m 远大于 K),每个机器负责 m/K 个小区间。当有新机器加入的时候,我们就将某几个小区间的数据搬移到新机器上去。这样,既不用全部重新计算哈希值,搬移数据,也保持了各个机器上数据数量的均衡。1.首先,我们把全量的缓存空间当做一个环形存储结构。环形空间总共分成2^32个缓存区,在Redis中则是...原创 2018-11-22 10:22:19 · 200 阅读 · 0 评论 -
Leetcode 102 二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]] 【思路一:广度优先搜索】先将root进队,进入循环。判...原创 2018-12-10 11:05:58 · 117 阅读 · 0 评论 -
KMP字符串匹配算法(看完必懂!!!)
KMP算法的原理这个算法理解起来比较复杂,看了网上很多帖子,写的都很乱,不容易理解。现在结合看过的一些书和视频写一些好理解的笔记,希望能给大家带来帮助:总的思想还是想要回退的时候能尽量偷懒,利用已知的信息,阮老师讲的很清楚:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm....原创 2018-12-18 14:21:41 · 860 阅读 · 0 评论 -
Algorithms 普林斯顿算法课程笔记(一)
本节将从动态连接性算法(并查集问题的模型)入手,引入算法分析和设计的整体思路和优化方法,为整个课程的引子部分。主要内容包括 Quick Find和Quick union算法,以及这些算法的改进。动态连接性对于连接做如下定义:自反:p 连接于自身 对称:若p连接于q,则q连接于p 传递:若p连接q,q连接r那么p连接r我们的算法需要满足上述关于连接的定义。另外,引出了另一个概念...原创 2019-01-12 22:36:47 · 1661 阅读 · 0 评论 -
二叉树的结点相关计算公式
二叉树的结点计算问题及性质 性质1 : 二叉树的第 i 层上至多有 2^(i-1) 个结点 (i>=1) 性质2 : 深度为 k 的二叉树至多有 2^k -1 个结点( k>=1) 性质3 : 对任意的一颗二叉树 T ,若叶子结点数为 n0,而其度数为 2 的结点数为 n2,则 n0 = n2+1 性质4 :...原创 2019-03-15 10:27:15 · 22751 阅读 · 0 评论 -
Leetcode 559. N叉树的最大深度(DFS和BFS解法)
给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。例如,给定一个3叉树:返回其最大深度,3。说明:树的深度不会超过1000。 树的节点总不会超过5000。【DFS解法】/*// Definition for a Node.class Node {public: int val; vecto...原创 2019-03-02 10:57:07 · 254 阅读 · 0 评论 -
二叉树遍历算法C++实现
本文参考清华邓公课程内容。先序遍历先来看递归法://先序遍历递归实现算法template <typename T,typename VST>//元素类型、操作器void traverse(BinNodePosi(T) x,VST & visit){ if(!x) return; visit(x->data);//访问当前节点 tr...原创 2019-02-10 12:35:04 · 3996 阅读 · 2 评论 -
leetcode 452 最少数量的箭引爆气球
在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了。开始坐标总是小于结束坐标。平面内最多存在104个气球。一支弓箭可以沿着x轴从不同点完全垂直地射出。在坐标x处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xen...原创 2019-02-03 16:01:59 · 259 阅读 · 0 评论 -
数据结构_栈及其应用
栈及其应用栈 栈是存放数据对象的一种特殊容器,栈中的元素始终遵循后进先出的顺序,作为一种抽象数据类型,栈支持的操作接口如下:stack&amp;lt;T&amp;gt; S;S.pop();S.top();S.push();s.empty();s.size();123456栈的应用逆序输出 输出次序与...转载 2019-02-03 14:53:07 · 435 阅读 · 0 评论 -
用队列实现栈&&用栈实现队列
一、用两个栈实现队列所谓用两个栈实现一个队列是指,我们要实现队列的“尾插”和“头删”操作。首先,假如我们要插入一些数据“abcd”,我们知道按照这个顺序队列出现的结果也是“abcd”,而栈会出现“dcba”,刚好相反,因此将该栈的到的数据在插入另外一个栈中就会出现我们想要的结果。因此,我们定义两个栈为“stack1”和“stack2”,栈1只用来插入数据,栈2用来删除数据栈1插入进来的数据...原创 2019-02-01 22:36:24 · 179 阅读 · 0 评论 -
leetcode 215 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。【解法一】时间复杂度 O...原创 2019-01-16 11:05:04 · 140 阅读 · 0 评论 -
快速选择算法Quick Select Algorithm(Java和C++代码实现)
what is Quick select?快速选择是一种从无序列表找到第k小元素的选择算法。它从原理上来说与快速排序有关。同样地,它在实际应用是一种高效的算法,具有很好的平均时间复杂度,然而最坏时间复杂度则不理想。快速选择及其变种是实际应用中最常使用的高效选择算法。总体而言,Quick select采用和Quick sort类似的步骤。首先选定一个pivot,然后根据每个数字与该pivo...原创 2019-01-16 11:04:19 · 2911 阅读 · 0 评论