数据结构与算法分析
准备笔试面试,复习数据结构的内容。
参考资料:leetcode&小象邹博老师的算法课
NearXDU
西电三系小硕,互联网爱好者。
展开
-
最接近0的数组子序列
给定一个数组,在数组中找一段子序列,要求子序列的和最接近0。 例如: 输入:[-3, 1, 1, -3, 5], [0, 2], [1, 3], [1, 1], [2, 2] ,[0, 4]都是可行解sum[i,j]表示[i,j]索引的所有元素的和。 sum[i,j]可以换算成下面公式: sum[i,j]=sum[0,j]-sum[0,i] + num[i]这里为了方便起见,在写代码时原创 2017-02-14 20:27:39 · 1143 阅读 · 0 评论 -
旋转数组求最小值
旋转数组的概念就是对有序数组循环向右移动K位得到的数组。 例如[1,2,3,4,5]经过右移2位后旋转后得到:[4,5,1,2,3]一、如何得到旋转数组比如说现在要求旋转右移K位,求移动后的结果。第一步要对K进行处理,因为假设原数组是[1,2,3]: 当K=1,旋转数组为[3,1,2] 当K=2,旋转数组为[2,3,1] 当K=3,旋转数组为[1,2,3] 当K=4,旋转数组为[3,1,原创 2017-02-14 16:44:14 · 2156 阅读 · 0 评论 -
第一个没有出现的正整数
题目描述在一个数组中,找出从1~n 第一个没有出现的正整数,n是数组容量。分析这个题目是有多种解法:一、暴力求解从1~n每次迭代搜索,复杂度为O(n2)O(n^2)二、排序先排好序列再用二分,复杂度可以降低到O(nlogn)O(nlogn)三、哈希申请额外的空间,大小为n,表示1~n个正整数。遍历原数组,把出现的且在1~n范围的数的索引设为true,也就是hash[nums[i]]=true,且1<原创 2017-02-12 22:10:27 · 1194 阅读 · 0 评论 -
求局部峰值
在序列中如果一个数比其左右两边都要大,那么称之为局部峰值,一个序列中可能有一个或者多个局部峰值,找出其中一个。比较简单的办法是从0开始迭代,这样的时间复杂度是O(n)O(n),我们知道二分查找的复杂度是O(logn)O(logn),因此考虑用二分的思路来做。class Solution {public: int findPeakElement(vector<int>& nums) {原创 2017-02-12 20:38:02 · 2329 阅读 · 1 评论 -
二分查找
二分查找是既简单又困难的部分,如果序列有序,我们可以使用二分查找,总结如下:一、递归的二分查找递归的方法来解决二分查找。int bsearch(vector<int>&nums,int low,int high,int target){ if(low>high) return -1; int mid=(low+high)/2; if(nums[mid]>ta原创 2017-02-12 18:20:17 · 708 阅读 · 0 评论 -
选择绝对众数
绝对众数的概念表示序列中的唯一众数,且出现的次数大于N2\frac{N}{2},NN表示序列的长度。 实际上在序列中如果某个数的出现次数超过该序列长度的一半,那么该数一定是唯一的众数。解决这个问题的办法有多: 1.排序,时间复杂度为O(nlogn)O(nlogn),返回nums[N/2]。 2.使用hash,时间复杂度可以降低到O(n)O(n),但需要额外的空间复杂度。有更好的办法,O(n)O原创 2017-02-12 16:00:01 · 704 阅读 · 0 评论 -
Eratosthenes筛选法求小于N的所有素数个数
Eratosthenes筛选法求小于N的所有素数个数原创 2017-02-09 00:05:06 · 2493 阅读 · 0 评论 -
Polya问题
Polya问题给定红色和蓝色给八个棋子涂色,求所有的涂色方案,其中某种方案可以通过旋转到另一种,则这两种方案视作一种。研一组合数学讲的波利亚定义,旋转轮换的内容。如果用代码解决,可以将八个棋子视作二进制的8位。那么如果不考虑条件所说的旋转算一做,那理论上有255种不同的方案。同样是筛选法的思想,假设现在一共255种方案,那么遍历这些方案,对某种方案循环左移8次(8次后肯定会回到相同的位置),循环左移原创 2017-02-09 00:06:11 · 640 阅读 · 0 评论 -
整数次幂的递归求解
整数次幂一般解法时间复杂度O(n)O(n)的方法可以迭代n次,然后相乘结果返回,例如求xnx^n伪代码:double pow(x,n){ res=x; while(n--) res*=x; return res; }递归法使用递归的方法可以将复杂度降低到O(logn)O(logn) 思路是比如一个数的8次幂,可以看成4次幂乘4次幂,进而分成原创 2017-02-09 00:07:31 · 3761 阅读 · 1 评论 -
字符串应用之最长回文串
以前做过一个方法就是从中间往两头扩展。manacher算法是对这种算法的优化。比如字符串是FGFXXAXXFGF,在以A为中心的回文串中,还包含FGF这样回文串,那么当我们计算右边的FGF时,可以利用左边FGF的信息,因为他们是对称的,这就是Manacher算法的思想。另外考虑奇数和偶数的不同情况,预先对字符串进行预处理,每隔一个字符插入一个“#”,那么原字符假如是ABA将变成#A#B#A#,原字符原创 2017-02-07 12:43:40 · 765 阅读 · 0 评论 -
字符串应用之全排列
之前在leetcode做过全排列的题目,LeetCode46和LeetCode47分别是不带重复元素和带重复元素的全排列,当时图个简单,直接用STL的next_permutation去做了,这一次把递归算法学习了一遍。不重复元素的全排列对于1234….n这样的全排列,他的全排列有n!n!种,因此求解该问题的时间复杂度为n!n!。其实要求全排列,无非就是对元素进行交换,使他们出现在不同的位置。代码cl原创 2017-02-06 14:53:23 · 569 阅读 · 0 评论 -
字符串应用之最长上升字序列LIS
用LCS解决LIS问题最长上升子序列有它的套路,不过用LCS算法是可以解决的: 假设原序列为AA 第一步:现在对原序列进行排序得到排序后的序列BB 第二步:考虑原序列AA可能有重复元素,对序列BB还要进行去重得到序列B′B^{'} 第三步:对AA和B′B^{'}做LCS运算,即可得出原序列AA的LIS最长上升子序列。好,这个算法在LeetCode是Memory Limit代码class So原创 2017-02-06 13:00:51 · 1050 阅读 · 0 评论 -
字符串应用之最长公共子序列和最长公共子串
最长公共子串和最长公共子序列原创 2017-02-05 18:26:44 · 652 阅读 · 0 评论 -
单链表
单链表原创 2017-02-05 18:17:59 · 502 阅读 · 0 评论 -
栈的应用之最长匹配括号长度
最长匹配括号长度主要介绍栈的一个应用,之前做过类似的题目,这次彻底搞懂,记录之。。找到最长匹配括号长度,这题比较难,之前刷题的时候就觉得,这次学到了。 比如说()()()(((最长匹配括号长度为6,((())最长匹配括号长度是4。 1.如果是左括号肯定是压栈(压入该左括号在串中的索引)。 2.如果是右括号: 那么就要分两种情况: 第一种情况是栈不为空,说明找到了匹配的左括号,原创 2017-02-05 18:22:09 · 732 阅读 · 0 评论