数据结构和Algorithm
文章平均质量分 70
行云流水1234567
这个作者很懒,什么都没留下…
展开
-
算法面试题学习笔记(3)
5.给定多个区间,计算重叠区间的个数。区间的定义为:例如,给定区间[1,5],[10,15],[5,12],[17,21],那么输出重叠区间的个数为3。solution:算法分成三步进行。第一步将给定的区间转化成点集合进行存储,这个点集合记录了区间端点的值和类型,是左端点,还是右端点。第二步对点集合中的元素使用sort()进行排序,得到一个升序的序列。第三步对排序的序列原创 2015-01-02 11:28:41 · 330 阅读 · 0 评论 -
构造函数&拷贝构造函数&赋值构造函数
class和struct很大一个区别在于,c除了成员的访问控制权限,struct中的成员默认是public,而class中的field默认是private;class还有一个special的地方是它有构造函数:constructor。构造函数是class中的一员,和成员变量、其他成员函数一起构成一个完整的class。构造函数用来在memory中开辟一个内存空间,并返回一个类实例的引用。构造原创 2016-04-28 11:40:05 · 586 阅读 · 1 评论 -
树的定义和性质
树是很重要的一种数据结构。在算法上它有递归和非递归处理,在现实上可以和栈、队列相结合。此外还应用在多种场合,比如排序、查找。在逻辑上,它不同于顺序表的一对一、图的多对多,树是一个对象对应对个对象的数据结构。树的存储方式可以有链式存储,可以有线性存储。大部分的操作使用的是链式存储,但在和堆、排序相关的情况下用的是线性存储。树的表示方式很多,在项目中最常见到的树形表示、括号表示,比如:A(原创 2016-05-03 18:56:00 · 1240 阅读 · 0 评论 -
字符串的模式匹配
字符串的模式匹配是数据结构中很重要的一部分内容,它是字符串的一个应用。记得当时吴暇老师给我们将数据结构的时候多次强调的,已经还给老师多年,今天来review下。所谓模式匹配是这个意思:有两个字符串,such as “abbcabd" n ”bca”。求bca是不是abbcabd的子串,如果是就返回在abbcabd中出现的bca的下标值。在这个demo中是2。那么abbcabd叫作目标原创 2016-04-29 21:18:14 · 298 阅读 · 0 评论 -
查找
9.给定n个元素构成的数组,找出这个数组中和为0的元素组合。要求不能有重复的组合。例如,array={-1,0,1,2,-1,-4},满足题意的组合是(-1,0,1)和(-1,-1,2)solution:如果使用暴力查找的算法,也就是先选出第一个元素,然后选出第二个和第三个,那么算法的时间复杂度为O(n*n*n)可以先对数组进行排序,然后遍历的方式选出第一个元素,再通过两指针的方式原创 2015-01-25 22:38:14 · 298 阅读 · 0 评论 -
实现堆栈中最小的元素getMin()
需求:1、实现一个堆栈,具备堆栈的性质,和相关pop, push, create, peek, clear等操作2、在1的基础上,对这个堆栈实现一个getMin()的操作,该操作get到当前堆栈中最小的元素3、要求getMin()的时间复杂度是O(1)算法:1、实现该堆栈使用顺序存储结构,基础操作具体实现方式见:http://blog.csdn.net/nigel_lee_be原创 2016-12-02 15:09:31 · 885 阅读 · 0 评论 -
重要的数据结构--堆栈
先declare下,此堆栈(stack)不是内存中的stack,而是一种十分重要的数据结构,后进先出(LIFO)的数据结构。堆栈区别于树和图,是一种顺序结构,它只能在一端进行增加元素,或者删除元素的操作。这个所谓的“端” 就是栈顶。一个stack当且仅当一个元素没有时,是空栈。作为一种data structure,它相关的操作主要有以下几类:1)create一个堆栈,并初始化2)判原创 2016-11-28 15:25:17 · 2241 阅读 · 0 评论 -
Foundation中的可变字符串对象
区别于NSString,可变字符串NSMutableString对象的所引用的字符串内容可以被修改,这种修改包括:删除、插入、替换等。而NSString是NSMutableString的子类,本身并不能修改指向的字符串,只能改变指向的字符串。Foundation提供了对于可变字符串对象的修改,现在看几个小需求。1.在str字符串的第2个字符串的位置插入字符串replaceNSMut原创 2016-06-22 16:00:13 · 264 阅读 · 0 评论 -
温故而知新,now复习一下Foundation中的字符串对象
Foundation中string Objects原创 2016-06-20 22:23:41 · 199 阅读 · 0 评论 -
Foundation中String对象常用API
Foudation的字符串对象处理常用API原创 2016-06-27 17:46:11 · 349 阅读 · 0 评论 -
求给定数组右移动k位后的数组
3. 给定一个数组,输出这个数组中元素向右边移动K位的新数组,要求算法的时间复杂度是O(n),空间复杂度是O(1)例如,数组array={1,2,3,4,5,6},其中元素向右边移动4位的新数组为{3,4,5,6,1,2}solution:数组旋转的算法有两种实现方式:一是使用一个额外的数组,用来写入移动后的元素。由于只需要通过遍历每个元素,计算元素新的index,再写入新的数组中原创 2015-01-01 22:59:00 · 2761 阅读 · 1 评论 -
数组中的查找两个元素,它们的和是指定的值
1. 在一个既定的数组中,给定一个目标值,判断数组中是否存在和为给定数的元素。例如,数组array={1,5,2,6,8,13}, 指定的目标值target=10,那么可以找到的array中的元素为2和8。solution:如果使用两次遍历,算法的时间复杂度是O(n*n)。如果是先排序,再使用两个指针分别从数组头和尾部依次遍历,那么算法的时间复杂度度是O(nlogn)。具体来原创 2015-01-01 17:05:29 · 3492 阅读 · 0 评论 -
在一个数组中找到前k个小(大)的数
11.给定一个一维数组,找出其中最小的前K个数,要求算法的时间复杂度为O(nlogK)solution:借鉴堆排序的算法,通过使用最小堆选出前K个最小的数。首先创建size=K的最小堆;堆顶为堆中最大的元素。然后遍历数组元素,往最小堆中插入元素,如果堆的个数已经达到K。那么新插入的元素需要和堆顶元素比较。如果这个元素小于堆顶元素,将堆顶元素移除,插入新的元素。最后当遍历结束原创 2015-01-25 22:43:23 · 814 阅读 · 0 评论 -
两个有序数组,求有序合并以后的第K个元素
13.给定长度分别是m和n的降序有序数组,要求找到将两个数组也按照降序合并的第K个元素。算法的时间复杂度是O(K)solution:如果通过两数组合并的方法,也就是使用两个指针分别遍历2数组,依次比较,使用一个新的数组空间存合并后的结果小的数组放入合并后的新数组中。并且对于的指针++。这个算法广泛使用在归并排序的归并阶段。但是算法的时间复杂度是O(m+n),因为需要两个指针遍历全部原创 2015-01-25 22:44:56 · 1117 阅读 · 0 评论 -
merge两个有序数组 & 查找一个有序数组中指定元素
20. 合并有序数组。给定升序排列的两个数组array1和array2,要求将array2合并到array1中,并保持结果有序是升序的。假设array1有足够的空间容纳array2.起初array1和array2的元素各有m和n个。solution:可以直接使用归并排序中的merge()对有序数组直接合并。但是由于不能使用额外的存储,不像归并排序那样,所以插入一个元素可能会导致元素原创 2015-01-25 22:48:49 · 819 阅读 · 0 评论 -
rotate array相关
17. 旋转数组最小值。输入一个升序排序的数组的旋转,输出旋转数组的最小值。比如,有序数组array1={1,2,3,4,5,6},它的一个旋转是{3,4,5,6,1,2},那么这个数组的最小值是1。solution:不难发现一个有序数组的旋转数组一定是局部有序的。只要是局部有序就可以使用二分查找。使用二分查找的循环方法,left=mid+1,right=mid-1。查找的目标就是原创 2015-01-25 22:46:56 · 299 阅读 · 0 评论 -
算法面试题学习笔记(5)
7.有序数组去重。给定一个排好序的数组,要求删掉重复出现的元素,并且不能使用额外的存储空间。最后返回新的数组。例如,array={1,2,3,3,3,5,7},输出新数组{1,2,3,5,7}solution:算法中使用两个指针left和right,分别用于标识元素的下标。left由0开始向下标增大的方向移动,而right初始位置由index为1的位置同样向着下标增大的方向移动。r原创 2015-01-03 17:12:19 · 336 阅读 · 0 评论 -
算法面试题学习笔记(4)
6. 插入并合并区间。要求是给定一组不重叠的区间和一个待插入的区间。如果有重叠的区间,进行区间合并,输出不重叠的区间例如,给定区间是[1,3]和[6,9],待插入并合并区间[2,5]。那么输出区间为[1,5]和[6,9]再如,给定区间是[1,2],[3,5],[6,7],[8,10],[12,16],待插入并合并区间[4,9]。那么输出区间为[1,2],[3,10],[12,16]so原创 2015-01-02 12:51:36 · 322 阅读 · 0 评论 -
leetcode-670-Maximum Swap
思路:借助一个stack结构,将int的num转成一个vector 进行存储。再借助一个vector, 对前一个vector里面的元素由大到小排序排序。从0-size() 比较这两个vector,确定位置变化的位置这两个元素。交换它们,最后把vector里面的元素按int方式输出即可int maximumSwap(int num) { if(num<10)return num; s原创 2017-09-05 20:22:06 · 509 阅读 · 0 评论