algorithm and data structure
Greetlist
这个作者很懒,什么都没留下…
展开
-
算法导论第六章 -- 堆排序
堆排序:主要是二叉堆,是一个数组,可以近似看作是一棵完全二叉树。主要性质:1.对于任意一个下标index,书上写的是左子女的下标为 2 * index,右子女为 2 * index + 1;但是在实际编程中,下标是从0开始的,所以下标的变化应该为:左子女为2 * index + 1, 右子女为 2 * index + 2;2.最大(小)堆:对于任意一个非叶节点,它的原创 2016-04-17 16:51:28 · 475 阅读 · 0 评论 -
OJ - 53 Maximum Subarray && 70 - Climbing Stairs
这两个是关于动态规划的题目。53 : Description: Find the contiguous subarray within an array (containing at least one number) which has the largest sum.For example, given the array [-2,1,-3,4,-1,2,1,-5,4], the conti原创 2017-08-27 14:56:23 · 321 阅读 · 0 评论 -
OJ 72 Edit Distance
Description: Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)You have the following 3 operations permitted o原创 2017-08-27 17:52:36 · 402 阅读 · 0 评论 -
查找--红黑树的定义
1.定义:红黑树是一颗二叉查找树,但是每一个节点多加上了一个变量来标识每一个节点的颜色,我们需要这个颜色来规定一些关于红黑树的规则,我们在构造红黑树的时候,需要每个时候都要保持这些规则: 1)每个节点不是黑色就是红色 2)根节点为黑色 3)每个叶节点是黑色的 4)没有两个红色节点相邻 5)对于每一个节点,从该节原创 2017-09-24 18:05:32 · 496 阅读 · 0 评论 -
查找 -- 红黑树的插入操作
接下来我们定义红黑树的插入操作,插入操作的函数原型为:Node<Key, Value>* insert(Node<Key, Value>* node);函数接受一个Node参数,并且把这个node插入到红黑树中,返回指向这个node的指针。我们要完成插入操作需要几个辅助函数,这几个函数为:void rotateLeft(Node<Key, Value>* node);void rotateRigh原创 2017-09-25 10:43:48 · 524 阅读 · 0 评论 -
查找 -- 红黑树的删除操作
在红黑树里面最复杂的操作就是对红黑树里面的节点进行删除了。不仅要进行二叉搜索树的删除操作,还需要进行对红黑树性质的保持。我们先定义删除操作的函数原型:void RBTree<Key, Value>::erase(Key key)函数接受一个Key类型的值,树会搜索含有这个值的节点,并且删除这个节点,如果找不到,不会对树进行任何的操作。删除操作也需要一些辅助函数:void rotateLeft(Nod原创 2017-09-25 15:16:37 · 442 阅读 · 0 评论 -
OJ -- 169. Majority Element
问题描述:在一个数组里面找出出现次数最多的一个数,(出现次数最多在本题里面被定义成为:出现次数多于N / 2 次)1.分析: 读完题目之后,会有几种解题方法浮现出来: (1)直接使用数组的index来解决这个问题:input : nums(arr of int)let arr be a new arr: for num in nums: arr...原创 2018-04-03 15:28:50 · 289 阅读 · 0 评论 -
OJ - 55 Jump Game
题目:给定一个都是正整数的数组,判断是否能到达数组的最后一个数。每一个元素代表了你最多能跳跃的步数。 得到这个题目之后,我们可以想到: 用[3,2,1,0,4]这个数组为例,index=0,nums[index] = 3,则我们最多只能跳到index为index+nums[index] = 3 + 0 = 3的地方,从index到index+nums[index]之间没有让我们能跳得更远的in原创 2018-05-09 10:28:22 · 313 阅读 · 0 评论 -
OJ - Two Sum && Three Sum
Two Sum: 题目的主题为搜索,那么我们就需要使用便于搜索的数据结构来解题:哈希表:h = hash()for num in vec: sub = target - num if sub in h: return (num, sub) else: h.insert(num)主体思想为:边插边找,找到了就直接return,这样可以避原创 2018-04-26 12:26:37 · 309 阅读 · 0 评论 -
OJ - 96 不重复的排序二叉树个数
1.题目:给一个正数,返回由[1, n] n个数组成的不重复的排序二叉树的个数。2.思路:使用动态规划来计算:例如我们在算1-4这四个数有多少个不同的组成的时候,1-4四个数都可以使用来作为根节点,则有下面四种情况: 我们假设我们需要的函数为F(x), 则F(0) = F(1) = 1,F(2) = 2, F(3) = 5【可以自行检验】 ① 当1为根节点的时候:那么剩下的元素只能全部在右原创 2018-05-07 17:46:25 · 334 阅读 · 0 评论 -
OJ - 75 对0,1,2进行排序(Sort Color)
题目:给定一个数组,数组里面的元素取值为:[0, 2],把这个数组排序。1.第一种做法:计数排序,因为数组里面的元素都是正数,可以直接索引到,所以我们直接可以开一个size为3的数组,用来保存0,1,2的个数。最后再直接覆写原来的数组即可。void sortColors(vector<int>& nums) { vector<int> current(3, 0); i原创 2018-05-08 20:07:26 · 670 阅读 · 0 评论 -
求平方根--牛顿迭代
文章目录相关文章主要思想解决平方根问题代码相关文章zhihu主要思想线性逼近解决平方根问题根据公式:平方根的问题即是 f(x) = x^2 - target // target 即是待求的数。X代码double sqrt(double target) { double res = target; // 初始化为target。 do...原创 2019-01-02 16:33:08 · 171 阅读 · 0 评论 -
一些DP题
文章目录LeetCode 300 -- Longest Increasing Subsequence (最长递增子序列)leetcode -- 5 Longest Palindromic Substring(最长回文子串)最长回文子序列的长度回文子串个数Longest Common SubString(最长公共子串)Longest Common Subsequence(最长公共子序列)Coin C...原创 2019-03-21 19:25:15 · 1002 阅读 · 0 评论 -
OJ -338 Counting bits
Description: Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1’s in their binary representation and return them as an array. Ex原创 2017-08-17 21:37:33 · 327 阅读 · 0 评论 -
OJ 141 --Linked List Cycle
Description:Given a linked list, determine if it has a cycle in it.Follow up:Can you solve it without using extra space?描述:给定一个链表,写一个函数确定这个链表是否有环。空间复杂度为O(1)思路:链表有环,则最原创 2017-08-02 22:28:39 · 341 阅读 · 0 评论 -
算法导论第七章 -- 快速排序
1.快速排序是一种直接在原来的数组上面进行排序的算法,不用另外开辟新的空间。任意选择一个元素,当作主元,把剩下的所有元素,比它大的放在右边,比它小的放在左边。2.最差时间复杂度是 O(n^2),造成最差时间复杂度的原因是:每一次的partition(划分子数组)都会造成不平衡的划分,都会划分成为n-1 个元素的子数组和0个元素的子数组,则每一次的运行时间加起来就是n^2。3.平均时原创 2016-04-18 16:23:57 · 537 阅读 · 0 评论 -
算法导论第八章 -- 计数排序
1.算法基本思想:对于在待排序的数组里面的数字,记录小于它的元素的个数,那么记录下来的这个数字就是它在输出数组里面的位置了这里假设元素是互异的。2.如果元素不互异,那么就要对算法里面的一个记录数组作一些操作,以便保持算法的正确性。代码如下:countSort.h#ifndef COUNTSORT_H#define COUNTSORT_H#include原创 2016-04-19 22:49:47 · 766 阅读 · 0 评论 -
对象的集合--队列,使用链表来实现
1.队列是一种基于先进先出策略的集合类型(FIFO)2.我们可以使用原始数组来完成一个队列的构造,但是我们使用链表当做队列的内部数据结构则更好,原因有两点:i.入队 和 出队 操作所需的时间跟集合大小无关。ii.所需空间跟集合大小成正比。原创 2016-12-16 15:14:34 · 708 阅读 · 0 评论 -
对象的集合--栈 ,使用链表来实现
1.之前的一篇文章里面写的是使用vector或者原始数组来实现一个栈,这篇文章则是使用链表来实现一个栈。2.使用链表来实现栈的好处在于:i.push 和pop 操作 都是与链表长度无关的。ii.所需的空间总是跟所要处理的数据的大小成正比。3.实现:list.hpp#ifndef LIST_HPP#define LIST_HPP#include原创 2016-12-13 23:22:13 · 487 阅读 · 0 评论 -
对象的集合 -- 栈,使用stl 中的vector 或者 原始数组来实现
1.栈的性质:后进先出(LIFO),只能从栈顶删除(pop)或添加元素(push)。2.栈的实现:实现一个栈主要是实现push(下压) pop(弹出) 两个操作,数据结构我们选择用STL 的 vector 或 原始数组。i.利用STL 的vector 我们可以容易地实现一个栈,而不用去考虑关于vector实现的细节。具体实现如下:stack.h#if原创 2016-12-12 17:13:12 · 731 阅读 · 0 评论 -
练习 -- 使用双向链表来实现双向队列
1.题目:使用一个双向链表来实现一个双向的队列,并且让队列具有以下的操作:(1)判断队列是否为空(2)得到双向队列中元素的个数(3)向左端添加一个新元素(4)向右端添加一个新元素(5)从左端删除一个元素(6)从右端删除一个元素2.分析:有了双向链表,我们就可以创建我们自己的双向队列,并且很容易地就能实现上面的操作3.代码:doubleli原创 2016-12-21 14:09:19 · 1314 阅读 · 0 评论 -
使用栈来实现括号匹配
1.题目:从标准输入中读取一个文本流并使用栈来判定其中的括号是否配对完整。例如:对于[()]{}{[()()]()} 打印 true;对于 [(]) 打印false。2.前提:已经定义好栈,只用构造解决函数即可。solution.hpp#ifndef SOLUTION_HPP#define SOLUTION_HPP#include "stack.hpp"原创 2016-12-16 17:27:15 · 443 阅读 · 0 评论 -
练习--实现双向链表
1.题目(算法p103-p104):实现一个双向链表,并且实现以下的函数:(1)在指定的节点之前插入节点(2)在指定的节点之后插入节点(3)删除指定节点(4)removeAfter(),接受一个链表节点作为参数,并删除该节点的后续节点(5)find(),接受一个key值,如果链表中某个节点的data域的值跟key相等,那么就返回true,否则返回false2.分原创 2016-12-20 17:33:04 · 455 阅读 · 0 评论 -
查找--二叉查找树
我们很多时候都在搜索,搜索相关电影的演员表,搜索相关英语单词的解释、含义,搜索特定人物的联系方式等等,我们为了解决这种问题,会使用到符号表这种工具,而符号表里面会有很多种不同的实现:比如说基于数组的符号表,基于树的符号表,这篇博客就是记录使用二叉树这种数据结构来实现一个符号表。1.概念:树这种数据结构,应该有很多人用过了,主要是由节点和指向节点的指针构成。我们可以回想一下在一个int数原创 2017-04-19 00:18:27 · 437 阅读 · 0 评论 -
OJ 287 -- Find the Duplicate Number
Description:Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicatenumber must exist. Assume that there is only o原创 2017-07-31 15:25:02 · 509 阅读 · 0 评论 -
KMP算法
1.字符串匹配:给定两个字符串S1, S2,我们需要确定S1里面是否包含S2,换句话说就是判断S2是否是S1的子串。 我们很容易想到的方法就是暴力搜索:从第一个字符开始匹配,如果不相等则顺序后移一位,再进行比较,伪代码为:n = s1.sizem = s2.sizefor i = 0 to n - m if s2[0 ... m-1] == s1[s ... s+m-1]原创 2017-08-09 00:31:04 · 384 阅读 · 0 评论 -
对32位的无符号int的位进行操作的一些相关函数
我们有时候会用到对一个32位的位集合来进行操作,比如: 1.设置一个unsigned int 的某一位. 2.得到给定范围内1的个数. 3.把指定的值放入一个整型数里面保存起来,比如RGBA(红,绿,蓝,透明度),这四个参数的取值范围都是0-255,一个unsigned char 类型即可保存一个参数,我们可以用一个unsigned int 类型来保存这四个值。 上面的这些情况就需要使用到位原创 2017-08-09 14:23:50 · 1097 阅读 · 0 评论 -
OJ 25
文章目录问题解决方案问题传送门解决方案以N为一个组,翻转这个组形成单链表,然后再链接下一个已经翻转的组主要就是解决分组的问题,把组分好了之后,就可以对每个组做单链表的翻转,然后再把每个组的尾节点返回。class Solution {public: ListNode* reverseKGroup(ListNode* head, int k) { if (he...原创 2019-08-13 14:47:46 · 160 阅读 · 0 评论