自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

涛爸的博客

勿在浮沙筑高台

  • 博客(132)
  • 收藏
  • 关注

原创 S中最接近中位数的k个元素

在《算法导论》第3版习题习题9.3-7提到,设计一个O(n)时间的算法,对于一个给定的包含n个互异元素的集合S和一个正整数 k<=n,该算法能够确定S中最接近中位数的k个元素。步骤如下:1: select A数组得到其中位数nmid,其下标为imid2: 计算A中每个数到中位数的差值作为数组dis, 并拷贝到数组dis_copy3: select dis_copy数组得到第k...

2018-07-24 11:46:13 1257 2

原创 最坏情况为线性时间的选择算法

《算法导论》第3版9.3讲解了最坏情况为线性时间的选择算法步骤如下1: 将输入数组的n个元素划分为 n/5 组,每组5个元素,且至多只有一组由剩下的 n%5 个元素组成。2: 寻找 n/5 组中每一组的中位数:首先对每组元素(至多为5个)进行插入排序,然后确定每组有序元素的中位数。3: 对第2步中找出的 n/5 个中位数,递归调用 select 以找出其中位数 num(如果有偶数个...

2018-07-23 20:17:54 1989 3

原创 期望为线性时间的选择算法

《算法导论》第3版9.2提到了期望为线性时间的选择算法 randomized_select 算法是以第7章的快速排序算法为模型的。 与快速排序一样,我们仍然将输入数组进行递归划分。 但与快速排序不同的是,快速排序会递归处理划分的两边, 而 randomized_select 只处理划分的一边。数组 A[p..r] 被划分为两个子数组 A[p..q-1] 和 A[q+1..r] ...

2018-07-20 11:15:37 1028

原创 最小值和最大值

《算法导论》第3版9.1提到了如何查找最小值和最大值1:锦标赛排序:为了确定min/max,必须要做n-1次比较 完整源代码放于github2:将一对输入元素相互进行比较,然后把较小的与当前最小值比较,把较大的与当前最大值进行比较。 这样,对每两个元素共需3次比较,总的比较次数至多是3n/2代码如下struct node { int max; in...

2018-07-19 15:50:23 618

原创 桶排序

《算法导论》第3版8.4描述了桶排序桶排序将[0,1)区间划分为n个相同大小的子区间,或称为桶。 然后,将n个输入数分别放到各个桶中。 为了得到输出结果,先对各个桶中的数进行排序,然后遍历每个桶, 按照次序把各个桶中的元素列出来即可。代码如下struct Node{ double value; Node *next;};void bucket_sort...

2018-07-18 18:06:41 199

原创 基数排序

《算法导论》第3版8.3提到了基数排序基数排序(radix sort)是一种用在卡片排序机上的算法。 先按最低有效位进行排序,再按次低有效位进行排序,重复这一过程,直到对所有的d位数完全排好序。 为了使基数排序正确运行,一位数排序算法:计数排序必须是稳定的。代码如下void radix_sort(int A[], int B[], int d){ int *C =...

2018-07-18 11:14:59 267

原创 计数排序

《算法导论》第3版8.2提到了计数排序计数排序假设输入n个输入元素中的每一个都是在0到k区间内的一个整数,其中k为某个整数。 计数排序的基本思想是:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置上了。但当有几个元素相同时,则不能把它们放在同一个输出位置上。 因此除了输入数组A[0..n-1],我们还需要两个数组:B[0..n-1]存放排序...

2018-07-18 11:11:07 176

原创 快速排序

《算法导论》第3版7.1提出了快速排序的描述与归并排序一样,快速排序也使用了分治思想。下面是对一个典型的子数组A[p..r]进行快速排序的三步分治过程:分解:数组A[p..r]被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每一个元素 都小于等于A[q],而A[q]也小于等于A[q+1..r]中的每个元素。其中,计算下标q也是划分过程的一部...

2018-07-16 10:37:26 177

原创 优先队列

《算法导论》第3版6.5讲解了优先队列优先队列(priority queue)是一种用来维护由一组元素构成的集合S的数据结构, 其中的每一个元素都有一个相关的值,称为关键字(key)。 一个最大优先队列支持以下操作:1) insert(S, x): 把元素x插入集合S中,这一操作等价于S=S∪{x}2) maximum(S): 返回S中具有最大键字的元素3) extract_m...

2018-07-15 17:50:24 239

原创 堆排序

在《算法导论》第3版第6章讲解了堆排序算法1:初始时候,利用 build_max_heap 将输入数组 A[0..n-1] 建成最大堆 2:因为数组中的最大元素总在根结点 A[0] 中,把它与 A[n-1] 互换,从而让该元素放到正确的位置。 3:这时候,从堆中去掉结点 n-1(–heap_size),剩余的结点中,原来根的孩子结点仍然是最大堆,而新的根结点 可能会违背最大堆的性质。为了...

2018-07-06 19:06:23 137

原创 LeetCode-053. Maximum Subarray

1. 题目Maximum Subarray 给定一个数组,找出其最大连续子序列和 2. 分析动态规划,先找出局部最优解,再从局部最优解中找出全局最优解3. 代码class Solution {public: int maxSubArray(vector<int>& nums)

2018-07-05 19:51:33 184

原创 最大子数组问题

1. 暴力解法在《算法导论》第3版习题4.1-2提到,对最大子数组问题进行暴力求解 使用两个for循环即可,代码如下void maxSubArray(vector<int> &nums){ int len = nums.size(); if (len &amp

2018-07-02 19:37:10 238

原创 LeetCode-067. Add Binary

1. 题目Add Binary 给定两个二进制字符串,返回它们的总和 (也是二进制字符串) 输入字符串都是非空的,只包含字符1或0。2. 分析从尾到头遍历字符串 每次取出1个字符,转为数字,若无字符则按0处理 定义进位carry,初始值为0 将三者加起来,对2取余即为当前位的数字,对2取商即为进位的值 注意return时候,carry千万不要遗漏,如果c...

2018-06-30 14:21:53 238

原创 两个n位二进制整数相加

《算法导论》第3版习题2.1-4中提到把两个n位二进制整数加起来的问题,这两个整数分别存储在两个n元数组A和B中,这两个整数的和应按二进制形式存储在一个(n+1)元数组C中。可先将A、B数组反转,按位相加,定义进位carry,初始化为0,将三者加起来,对2取余即为当前位,对2取商即为当前进位,再将C数组反转一次即可得到想要的结果。void reverseArray(int A[], int...

2018-06-30 13:47:36 1787

原创 LeetCode-018. 4Sum

1. 题目4Sum 查找数组中和为0的4个数 解决方案集不能含有重复项2. 分析1:传统k-sum问题,先排序,再左右夹逼 时间复杂度O(n^3),空间复杂度O(1) 2:借助unordered_multimap(允许重复key)缓存两数之和 时间复杂度O(n^2),空间复杂度O(n^2) 注意内层循环是for(int j = i + 1; j &lt...

2018-06-29 20:30:50 178

原创 LeetCode-016. 3Sum Closest

1. 题目3Sum Closest 求最接近target的三数之和 假定每个输入都只有一个解决方案2. 分析要保证三数和跟target差的绝对值最小 brute force时间复杂度为O(n^3) 优化的解法是先排序再左右夹逼 我们需要定义一个变量diff用来记录差的绝对值 先确定一个数,再滑动寻找另外两个数 每确定两个数,求出此三数之和 再算...

2018-06-28 20:16:57 199

原创 LeetCode-015. 3Sum

1. 题目3Sum 在数组中找到和为0的三个数,结果不重复2. 分析本题是Two Sum的扩展,brute force时间复杂度为O(n^3) 但这里使用哈希表的解法并不合适,因为结果数组中的元素可能出现重复 因此应该先排序,然后左右夹逼 用0减去[0,nums.size()-2)中的一个数得到一个sum 在剩余子数组中找到两数之和等于sum即可 将问题转...

2018-06-26 20:51:56 180

原创 LeetCode-001. Two Sum

1. 题目Two Sum 查找数组中和为特定值的两个数,返回其下标 假定每个输入都有一个解决方案,你不会使用同一元素两次2. 分析本题需要返回的是下标,而不是数字本身 所以不同于 S中是否存在两个其和刚好为x的元素 可以借助哈希表,保存数组中每个数的下标 遍历数组的同时在哈希表中查找即可3. 代码1)class Solution {publi...

2018-06-24 15:24:41 170

原创 S中是否存在两个其和刚好为x的元素

《算法导论》第3版习题2.3-7:描述一个运行时间为O(nlgn)的算法,给定n个整数的集合S和一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素。首先对S[0…n-1]进行非降序排序,然后左右夹逼即可 时间复杂度分析:排序为O(nlgn),左右夹逼为O(n),最终O(nlgn)bool find(int A[], int len, int target){ if (l...

2018-06-24 14:53:51 1047

原创 LeetCode-081. Search in Rotated Sorted Array II

1. 题目Search in Rotated Sorted Array II 在旋转有序数组中查找特定值 数组中有重复的数,查找特定值,若存在,返回true,若不存在,返回false 如[10,12,12,1,2,6,8,10] 10 返回true [10,12,12,1,2,6,8,10] 0 返回false2. 分析类似于 Search in Ro...

2018-06-23 16:07:16 194

原创 LeetCode-033. Search in Rotated Sorted Array

1. 题目Search in Rotated Sorted Array 在旋转有序数组中查找特定值 数组中没有重复的数,查找特定值,若存在,返回其下标,若不存在,返回-1 如[10,12,1,2,6,8] 12 返回1 [10,12,1,2,6,8] 0 返回-1 2. 分析数组中没有重复的数 若nums[start]<=nums[mid...

2018-06-23 15:28:11 173

原创 LeetCode-240. Search a 2D Matrix II

1. 题目Search a 2D Matrix II 编写一个搜索m*n矩阵中的值的有效算法,该矩阵具有以下性质: 每行中的整数从左到右排序。 每列中的整数从上到下排序。2. 分析以数组右上角的数为参考, 若target等于右上角数,则查找成功; 若target小于右上角数,则右上角数所在列不在查找范围; 若target大于右上角数,则右上角数所在...

2018-06-23 14:08:45 209

原创 LeetCode-074. Search a 2D Matrix

1. 题目Search a 2D Matrix 编写一个搜索m*n矩阵中的值的有效算法,该矩阵具有以下性质: 每行中的整数从左到右排序。 每行的第一个整数大于前一行的最后一个整数。2. 分析1:给定矩阵是有序的,可以采用两次二分查找,先找出行,再找出列 2:将该矩阵看成是一个一维数组,数组值为 matrix[ i / n ][ i % n ]3. 代码1...

2018-06-22 20:08:56 217

原创 LeetCode-069. Sqrt(x)

1. 题目Sqrt(x) 计算并返回x的平方根,其中x保证为非负整数。 由于返回类型是整数,所以小数位数被截断,只返回结果的整数部分。2. 分析1:二分查找 取定左值和右值,每次砍掉不符合条件的一半,直到左值和右值相遇 2:也可采用牛顿迭代法3. 代码class Solution {public: int mySqrt(int x) { ...

2018-06-21 18:57:43 177

原创 LeetCode-034. Search for a Range

1. 题目Search for a Range 给定升序数组nums,找到给定target的起始和结束位置 算法的运行时复杂度必须是O(log n) 若找不到target,返回[-1, -1]2. 分析属于变形的二分查找中的其中两种情况 即查找第一个等于或者大于value的元素 和最后一个等于或者小于value的元素 因此可在找出l后,在[l,last...

2018-06-20 20:19:50 171

原创 LeetCode-035. Search Insert Position

1. 题目Search Insert Position Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order. You may...

2018-06-20 20:08:04 187

原创 变形的二分查找

二分查找的原始写法如这篇文章所示 如果条件变化一下,比如数组中的元素可能重复,要求返回最小(或最大)的下标。 或者找出数组中第一个大于value(也就是最小的大于value)的元素下标等等, 代码实现会有所不同。 一共分为六种不同情况,下面列出这些变形的二分查找// 找出第一个与value相等的元素int firstEqual(int A[], int left, int ri...

2018-06-19 20:04:33 313

原创 二分查找

在《算法导论》第3版习题2.3-5里提出二分查找的算法 如果序列A已排好序,就可以将该序列的中点与v进行比较。 根据比较的结果,原序列中有一半就可以不用再做进一步的考虑了。 二分查找算法重复这个过程,每次都将序列剩余部分的规模减半。程序代码如下// 迭代版int binary_search_iterative(int A[], int left, int right...

2018-06-18 16:16:11 237

原创 求数组中的逆序对

在《算法导论》第3版习题2-4中讲到了如何求数组中的逆序对 假设A[0..n-1]是一个有n个不同数的数组。 若 i < j 且 A[i]>A[j],则对偶 (i,j) 称为A的一个逆序对(inversion)。 给出一个确定在n个元素的任何排列中逆序对数量的算法(提示:修改归并排序)题目已经提示修改归并排序可以完成,插入法是求逆序对的暴力解法,插入排序的次...

2018-06-18 13:57:42 510

原创 inet_ntoa--不可重入函数

在使用socket编程时,我们经常要使用到IP地址转换函数。 比如 char *inet_ntoa(struct in_addr in);该函数将用网络字节序整数表示的IPv4地址转化为用点分十进制字符串表示的IPv4地址。man inet_ntoa可以看到inet_ntoa是不可重入的 The string is returned in a statically al...

2018-06-17 16:14:54 1865

原创 网络字节序跟主机字节序有什么区别

网络字节序跟主机字节序有什么区别,这是我16年9月份校招面试腾讯被问到的一个问题,也是Linux服务器开发岗常考的面试题。字节序分为大端字节序和小端字节序大端字节序是指一个整数的高位字节(32-31bit)存储在内存的低地址处,低位字节(0-7bit)存储在内存的高地址处。小端字节序是指一个整数的高位字节(32-31bit)存储在内存的高地址处,低位字节(0-7bit)存储在内存的低地...

2018-06-16 15:25:29 5390

原创 LeetCode-148. Sort List

1. 题目Sort List Sort a linked list in O(n log n) time using constant space complexity.2. 分析题目限定时间复杂度必须为O(nlogn) 只能用快速排序、归并排序、堆排序 根据单链表的特点,最适于用归并排序 可复用 Merge Two Sorted Lists中的代码注意第...

2018-06-16 12:56:53 253

原创 LeetCode-023. Merge k Sorted Lists

1. 题目Merge k Sorted Lists 合并k个升序链表2. 分析将Merge Two Sorted Lists从2个扩展到k个 1:最直接的思路就是两两合并,1,2先合并,合并好了再跟3/…/k合并 注意ListNode *p = lists[0];而非ListNode *p = &lists[0];i的下标从1开始p = mergeT...

2018-06-15 19:43:35 190

原创 LeetCode-021. Merge Two Sorted Lists

1. 题目Merge Two Sorted Lists2. 分析采用归并排序的思想3. 代码1)class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(l1 == NULL) return l2; i...

2018-06-14 18:40:01 321

原创 LeetCode-088. Merge Sorted Array

1. 题目Merge Sorted Array 合并两个有序数组 假设nums1有足够的空间(>=m+n)来保存nums2中的附加元素2. 分析采用归并排序的思想 1:两数组都有序,所有按顺序比较大小即可。 建立一个长度为m+n的total数组,逐个比较nums1、nums2数组中的元素, 先将较小元素放入total,再考虑两数组剩余元素, 最后再把to...

2018-06-13 20:09:44 223

原创 归并排序

1. 归并排序(设置哨兵)《算法导论》第3版2.3.1分治法里提出了归并排序的算法 归并排序算法完全遵循分治模式 1)分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列 2)解决:使用归并排序递归地排序两个子序列 3)合并:合并两个已排序的子序列以产生已排序的答案设置哨兵,它不可能为较小值void mergeWithSentry(int A[],...

2018-06-12 20:20:59 338

原创 LeetCode-082. Remove Duplicates from Sorted List II

1. 题目Remove Duplicates from Sorted List II 对有序链表去重,删掉所有的重复元素2. 分析若链表长度小于2,直接结束 否则,遍历链表,当相邻元素相等时,删除所有重复元素3. 代码class Solution {public: ListNode* deleteDuplicates(ListNode* head) {...

2018-06-11 19:38:22 160

原创 LeetCode-083. Remove Duplicates from Sorted List

1.题目Remove Duplicates from Sorted List 对有序链表去重,使每个元素只出现1次2.分析若链表长度小于2,直接结束 否则,遍历链表,当相邻元素相等时,删除后出现的重复元素3.代码class Solution {public: ListNode* deleteDuplicates(ListNode* head) { ...

2018-06-11 19:34:18 120

原创 LeetCode-080. Remove Duplicates from Sorted Array II

1.题目Remove Duplicates from Sorted Array II 在Remove Duplicates from Sorted Array 的基础上,允许每个元素重复出现2次 如[1,1,2,2,2,3],生成新数组为[1,1,2,2,3] 2.分析1:在[2, len)范围内遍历数组 将nums[i]与numsindex - 2作比较 若不...

2018-06-09 15:26:59 134

原创 LeetCode-026. Remove Duplicates from Sorted Array

1.题目Remove Duplicates from Sorted Array 去除数组中的重复元素,返回新数组的长度 数组中的每个元素只允许出现1次 如[1,1,2,2,2,3],生成新数组为[1,2,3] 2.分析1: 数组已经有序,所以重复元素一定相邻 从[1,size-1]遍历数组,依次与新数组的最后1个元素比较即可 若数组长度<=2,则返回...

2018-06-09 15:18:51 179

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除