自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

冰殇的博客

「Talk is cheap. Show me the code」

  • 博客(43)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 《程序员代码面试指南》Python实现(个人读书笔记)

说明  最近一直在读左神的书——《程序员代码面试指南—IT名企算法与数据结构题目最优解》,为了记录自己的学习成果,并且方便以后查看,将自己读书时的想法与使用python实现的代码记录在此博客。   >>>github代码地址>>>栈和队列设计一个有getMin功能的栈由两个栈组成队列如何仅用递归函数和栈操作逆序一个栈用一个栈实现另一个栈的排序生成窗口最大值数组构造数组的MaxTree

2017-09-09 21:57:34 13282 5

原创 栈和队列---求最大子矩阵的大小

【题目】  给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1的数量。   例如:   1 0 1 1   1 1 1 1   1 1 1 0   其中,最大的矩形区域有6个1,所以返回6.【题目】  如果矩阵的大小是O(N*M),本题可以做到时间复杂度为O(N*M)。 1、矩阵的行数是N,以每一行做切割,统计以当前行作为底的情况下,每个位置

2017-09-30 18:03:25 1318 1

原创 栈和队列---构造数组的MaxTree

【题目】  定义二叉树节点如下:class Node: def __init__(self, value): self.value = value self.left = None self.right = None  一个数组的MaxTree定义如下:   1、数组中必须没有重复元素   2、MaxTree是一棵二叉树,数组的每一个值对应

2017-09-30 16:07:54 779

原创 栈和队列---生成窗口最大值数组

【题目】  有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右滑动一个位置。      例如,数组为[4,3,5,4,3,3,6,7],窗口大小为3时:依次出现的窗口为[4,3,5], [3,5,4], [5,4,3], [4,3,3], [3,3,6], [3,6,7]。  如果数组长度是n,窗口大小是w,则一共产生n-w+1个窗口。      请实现一个函数。

2017-09-30 12:25:34 1301

原创 栈和队列---用一个栈实现另一个栈的排序

【题目】  一个栈中元素的类型是整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。如何完成排序?【基本思路】  不断将栈顶元素cur弹出,如果新栈为空、或者新栈栈顶元素大于cur,直接将cur压入新栈中;否则,将新栈中的元素逐一弹出压回原来的栈中,直到新栈的栈顶元素大于cur,再将cur压入新栈中.继续弹出原来栈的栈顶...

2017-09-30 12:04:54 724

原创 栈和队列---如何仅用递归函数和栈操作逆序一个栈

【题目】  一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1。将这个栈转置后,从栈顶到栈底为1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数实现,不能使用其他数据结构。【基本思路】  首先实现一个递归函数 a,其功能是返回并移除栈底元素。之后再实现一个递归函数 b,其功能是不断用递归的临时变量去接住 a 函数返回的栈底元素,这样,最后一个栈底元素就是原来栈的

2017-09-30 11:53:59 895

原创 栈和队列---由两个栈组成队列

【题目】  编写一个类,用两个栈实现队列,支持队列的基本操作(add, poll, peek)。【基本思路】  使用两个栈stackpush、stackpop,stackpush栈负责压入数据、stackpop栈负责将stackpush中的元素逆序,用于获取或者弹出栈顶元素。但是有一个规则:stackpop只有为空的时候才再次向stackpush栈索要元素,而且,必须一次拿走stackpush中当前

2017-09-30 11:39:15 901

原创 栈和队列---设计一个有getMin功能的栈

【题目】  实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。【要求】pop、push、getMin操作的时间复杂度都是O(1)。设计的栈类型可以使用现成的栈结构【代码实现】#python3.5class NewStack1: def __init__(self): self.stackData = [] self.stack

2017-09-30 11:27:31 2589

原创 数组与矩阵---数组排序之后相邻数的最大差值

【题目】  给定一个整型数组arr,返回排序后的相邻两数的最大差值   例如:   arr = [9, 3, 1, 10]。如果排序,结果为[1, 3, 9, 10],9和3的差为最大值,故返回6.   arr = [5, 5, 5, 5]。返回0.   要求时间复杂度O(N).【基本思路】  利用桶排序的思想(不是直接进行桶排序),可以做到时间复杂度O(N),空间复杂度O(N...

2017-09-23 11:21:18 1146

原创 数组与矩阵---数组中未出现的最小正整数

【题目】  给定一个无序整型数组arr,找到数组中未出现的最小正整数。   例如:   arr = [-1, 2, 3, 4],返回1   arr = [1, 2, 3, 4],返回5【基本思路】  生成变量left和right,left表示遍历到目前为止,数组中已经包含的正整数的范围是[1…left],初始时令left = 0表示没有arr目前没有包含任何正整数;right表示遍历到目前为止

2017-09-22 09:38:33 976

原创 数组与矩阵---求最短通路值

【题目】  给定一个整型矩阵matrix表示一个网络,1代表有路,0代表无路,每一个位置只要不越界,都有上下左右四个方向,求从最左上角到最右下角的最短通路值。   例如,matrix为:   1 0 1 1 1   1 0 1 0 1   1 1 1 0 1   0 0 0 0 1    通路只有一条,由12个1构成,所以返回12。【基本思路】  使用宽度优先遍历即可。生成map矩阵,m

2017-09-22 08:55:26 1361

原创 数组与矩阵---数组的partiton调整

【题目】  给定一个有序数组arr,调整arr使得这个数组的左边部分没有重复元素且升序,而不用保证右半部分是否有序。 例如,arr = [1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 8, 9],调整之后arr = [1, 2, 3, 4, 5, 6, 7, 8, 9……]【补充题目】  给定一个数组arr,其中只可能含有0,1,2三个值,请实现arr的排序。

2017-09-21 23:01:41 451

原创 数组与矩阵---不包含本位置值的累乘数组

【题目】  给定一个整型数组arr,返回不包含本位置值的累乘数组。   例如,arr = [2, 3, 4, 1],返回[12, 8, 24, 6],即除自己以外,其他位置上的累乘。【要求】时间复杂度O(N)除需要返回的结果数组外,额外空间复杂度O(1)。【基本思路】  方法一。使用除法进行实现。所有数的累积记为all,如果数组中不存在0,那么结果数组中每一个位置的值为 all/arr[i]

2017-09-21 22:24:50 558

原创 数组与矩阵---边界都是1的最大正方形大小

【题目】  给定一个N×N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度。   例如:   0 1 1 1 1   0 1 0 0 1   0 1 0 0 1   0 1 0 1 1   其中,边框全是1的最大正方形的大小是4*4,返回4。【基本思路】 比较容易理解的方法:矩阵中一共有N*N个位置。O(N2N^2)每一个位置都可以成为边长为N

2017-09-20 09:56:59 1222

原创 数组与矩阵---打印N个数组整体最大的TopK

【题目】  有N个长度不一的数组,所有的数组都是有序的,请从大到小打印这个N个数组整体最大的前K个数。   例如,输入含有N行元素的二维数组可以代表N个一维数组。   219, 405, 538, 845, 971   148, 558   52, 99, 348, 691   再输入整数k = 5,则打印:   971, 845, 691, 558, 538【要求】如果所有数组的元素

2017-09-19 11:29:24 858

原创 数组与矩阵---数组中子数组的最大累乘积

【题目】  给定一个double类型的数组arr,其中的元素可正、可负、可0,返回子数组累乘的最大乘积。例如,arr = [-2.5, 4, 0, 3, 0.5, 8, -1],子数组[3, 0.5, 8]累乘可以获得最大的乘积12,所以返回12.【基本思路】  本题可以做到时间复杂度O(N)、空间复杂度O(1).  大致思路是,遍历一遍数组,求出以每一个元素结尾的子数组的最大累乘积。如何快速的求出

2017-09-19 09:14:12 850

原创 数组与矩阵---在数组中找到一个局部最小的位置

【题目】  定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0] < arr[1],那么arr[0]是局部最小;如果arr[N-1] < arr[N-2],那么arr[N-1]是局部最小;如果 0 < i < N-1,既有 arr[i] < arr[i-1],又有arr[i] < arr[i+1],那么arr[i]是局部最小。   给定无序数

2017-09-19 08:47:49 1319

原创 数组与矩阵---子矩阵的最大累加和问题

【题目】  给定一个矩阵matrix,其中的值有正、有负、有0,返回子矩阵的最大累加和。   例如,matrix为:   -1 -1 -1   -1  2  2   -1 -1 -1   其中最大累加和的子矩阵为:   2 2   所以返回4。【基本思路】  首先看这样一个例子,假设一个2行4列的矩阵如下:   -2  3  -5  7   1  4  -1  -3   如何求必

2017-09-18 18:04:32 839

原创 数组与矩阵问题---子数组的最大累加和问题

【题目】  给定一个数组arr,返回子数组的最大累加和,   例如,arr = [1, -2, 3, 5, -2, 6, 1],所有的子数组中,[3, 5, -2, 6]可以累加出最大的累加和为12,所以返回12。【基本思路】  使用一个变量curSum记录每一步的累加和,遍历到正数curSum增加,遍历到负数减小。当curSum < 0,说明累加到当前位置出现了小于0的结果,那么累加的这一部分肯

2017-09-18 17:43:22 677

原创 数组与矩阵---奇数下标都是奇数或者偶数下标都是偶数

【题目】  给定一个长度不小于2的数组arr,实现一个函数调整arr,要么让所有的偶数下标都是偶数,要么让所有的奇数下标都是奇数。要求时间复杂度O(N),空间复杂度O(1)。【基本思路】  使用两个指针even、odd。odd一直指向奇数位置,even一直指向偶数位置。初始是 even = 0、odd = 1。不断的检查数组最后一个数,如果该数是奇数就和odd位置的数交换,同时,odd += 2;如

2017-09-18 16:48:06 1529

原创 数组与矩阵---自然数组的排序

【题目】  给定一个长度为N的整型数组arr,其中有N个互不相等的自然数1~N,请实现arr的排序,但是不要把下标0~N-1位置上的数通过直接赋值的方式替换成1~N。【基本思路】  arr调整之后应该满足arr[index] = index + 1. 方法一。从左到右遍历数组,假设遍历到位置 i如果arr[i] == i+1,说明当前的位置不需要调整,继续遍历下一个位置如果arr[i] !=

2017-09-18 09:57:26 756

原创 数组与矩阵---计算数组的小和

【题目】  数组小和的定义如下:   例如:数组s = [1, 3, 5, 2, 4, 6],在s[0]的左边小于或者等于s[0]的数的和为0,在s[1]的左边小于或等于s[1]的数的和为1……将所有位置的左边比它小或者等于的数的和相加起来就是小和。   给定一个数组,实现函数返回s的小和。【基本思路】  最简单易懂的方法,就是依次遍历数组每一个位置 i,然后再遍历一次找到 i 左边所有小于或者

2017-09-18 09:19:36 1244

原创 数组与矩阵---未排序数组中累加和小于或等于给定值的最长子数组问题

【题目】  给定一个无序数组arr,其中元素可正、可负、可0,给定一个整数k。求arr所有的子数组中累加和小于或等于k的最长子数组长度。      例如:arr = [3, -2, -4, 0, 6],k = -2,相加和小于或等于-2的最长子数组为[3, -2, -4, 0],所以结果返回4。【基本思路】  该题可以做到时间复杂度O(NlogN),空间复杂度O(N)。   依次求以数组每个位

2017-09-17 23:50:52 894

原创 数组与矩阵---未排序数组中累加和为给定值的最长子数组系列问题

【题目】  给定一个无序数组arr,其中元素可正、可负、可 0,给定一个整数k。求arr所有子数组中累加和为k的最长子数组长度。【补充问题】  给定一个无序数组arr,其中元素可正、可负、可 0。求arr所有子数组中正数与负数个数相同的最长子数组长度。【补充问题】  给定一个无序数组arr,其中元素只是 1 或 0。求arr所有的子数组中 0 和 1 个数相等的最长数组长度。【基本思路】  使用一个

2017-09-16 22:23:13 644

原创 数组与矩阵---未排序正数数组中累加和为指定值的最长子数组长度

【题目】  给定一个数组arr,该数组无序,但每个值都为正数,在给定一个正数k。求arr中所有的子数组中所有元素累加为k的最长子数组长度。   例如,arr = [1,2,1,1,1],k = 3.   累加和为3的最长子数组为[1,1,1],所以返回结果为3。【基本思路】  使用两个指针left和right,代表子数组的范围,初始时都为 0。使用变量sum记录子数组的累加和,初始为arr[0]

2017-09-14 21:43:24 484

原创 数组与矩阵---不重复打印排序数组中相加和为给定值的所有二元组和三元组

【题目】  给定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组。例如,arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9],k = 10,打印结果为:1,9 2,8【补充题目】  给定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序三元组。例如,arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9],k = 1

2017-09-14 21:15:11 783

原创 数组与矩阵---最长可整合子数组的长度

【题目】  先给出可整合数组的定义。如果一个数组在排序后,每相邻两个数的差的绝对值都是1,则该数组为可整合数组。例如,[5,3,4,6,2]排序之后为[2,3,4,5,6],符合条件,所以这个数组为可整合数组。   给定一个整型数组arr,请返回其中最大可整合子数组的长度。例如,[5,5,3,2,6,4,3]的最大可整合子数组为[5,3,2,6,4],所以返回5【基本思路】  方法一...

2017-09-14 18:26:37 613

原创 数组与矩阵---在行列都排好的矩阵中找数

【题目】  给定一个N×M的整型矩阵matrix和一个正数K,matrix的每一行每一列都是排好序的。实现一个函数,判断K是否在matrix中。   例如:   0, 1, 2, 5   2, 3, 4, 7   4, 4, 4, 8   5, 7, 7, 9 如果K为7,返回True;如果K为6,返回False。 要求时间复杂度O(N+M),空间复杂度O(1)。【基本思路】  从第一

2017-09-14 18:09:51 483

原创 数组与矩阵---在数组中找到出现次数大于一半(N/K)的数

【题目】  给定一个整型数组arr,打印其中出现次数大于一半的数,如果没有这样的数,打印提示信息。要求时间复杂度为O(N),空间复杂度为O(1)。【进阶】  给定一个整型数组arr,再给定一个整型K,打印所有出现次数大于N/K的数,如果没有这样的数,打印提示信息。要求时间复杂度为O(N*K),额外空间复杂度O(K)。【基本思路】  对于原问题和进阶问题,都可以使用哈希表记录每个数出现的次数,但是额外

2017-09-13 09:41:57 1381

原创 数组与矩阵---需要排序的最短子数组长度

【题目】  给定一个无序数组arr,求出需要排序的最短子数组长度。   例如: arr = [1, 5, 3, 4, 2, 6, 7]返回4,因为只有[5, 3, 4, 2]需要排序。【基本思路】  解决这个问题可以做到时间复杂度O(N),空间复杂度O(1)。   首先从右到左遍历数组,使用两个变量,minOne记录遍历过程中出现的最小元素,minIndex表示需要调整的子数组的起始下标位置,开

2017-09-10 18:00:49 818

原创 数组与矩阵---找到无序数组中最小的k个数

反倒是

2017-09-09 17:57:23 745

原创 数组与矩阵---之字型打印矩阵

【题目】  给定一个矩阵 matrix,按照“之”字形的方式打印这个矩阵,例如:   1  2  3  4   4  5  6  8   9  10  11  12   “之”字形打印的结果为:1, 2, 5, 9, 6, 3, 4, 7, 10, 11, 8, 12  要求额外空间复杂度为O(1)【基本思路】上坐标(tR1,tC1)初始化为(0,0),先沿着矩阵第一行移动(tC1++),

2017-09-08 11:15:30 950

原创 数组与矩阵---将正方形矩阵顺时针转动90度

【题目】  给定一个N × N的矩阵 matrix,把这个矩阵调整成顺时针转动90°后的形式。   例如:    1  2  3  4    5  6  7  8    9   10   11  12    13  14  15  16      顺时针转动90°的结果为:   13   9   5   1   14  10  6   2   15  11  7   3

2017-09-08 11:03:51 1034

原创 数组与矩阵---转圈打印矩阵

【题目】  给定一个整型矩阵 matrix,请按照转圈的方式打印它。   例如:    1  2  3  4    5  6  7  8    9   10   11  12    13  14  15  16   打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10      要求额外空间复杂度为O(1).【基本思路】  一层一层的...

2017-09-08 10:49:26 1033

原创 位运算---在其他数都出现k次的数组中找到只出现一次的数

【题目】  给定一个整型数组arr和一个大于1的整数k,已知arr中只有一个数出现了一次,其他的数都出现了k次,请返回只出现1次的数。要求时间复杂度O(N),空间复杂度O(1)。【基本思路】  首先看一个七进制数无进位相加的问题。   七进制数a:     6 4 3 2 6 0 1   七进制数b:     3 4 5 0 1 1 1   无进制相加的结果:  2 1 1 2 0 1 2

2017-09-07 23:54:10 1115

原创 位运算---在其他数都出现偶数次的数组中找到出现奇数次的数

【题目】  给定一个数组arr,其中只有一个数出现了奇数次,其他数都出现了偶数次,打印这个数。【进阶问题】  有两个数出现了奇数次,其他数出现了偶数次,打印这两个数。【要求】  时间复杂度O(N),空间复杂度(1)。    【基本思路】  首先需要知道,整数n与0异或的结果是n,整数n与整数n异或的结果是0;同时,异或满足交换律和结合律。   知道上述的内容,解决这道题就很容易了。如果n出现了

2017-09-07 23:37:39 1532

原创 位运算---整数的二进制表达中有多少个1

【题目】  给定一个32位整数n,可正、可负、可0.返回该整数二进制表达中1的个数。【基本思路】  最简单的方法。整数n每次进行无符号右移一位,检查最右边的bit是否为1来进行统计即可。下面是使用c++实现的代码:int count1(int n){ unsigned int num = (unsigned)n; int res = 0; while(num != 0)

2017-09-06 22:33:10 1282

原创 C++中实现无符号右移

无符号右移的意思是右移时不考虑符号问题,即无论右移正数还是负数,其最高位都是补0。不同于普通的“>>”移位操作,使用“>>”右移时,是以符号扩展原则进行右移,即在右移过程中它将保持原有数据的正负号不变,简单地说,就是在右移正数时高位补0、右移负数时则高位补1。   在java中,提供了无符号右移操作符“>>>”,与普通的“>>”区分开来。但是在c++中并没有这样的操作符,在c++中实现的方式也很简

2017-09-06 21:46:47 6842

原创 位运算---不用任何比较判断找出两个数中的最大值

【题目】  给定两个32位整数a和b,返回a和b中较大的一个。要求不能使用比较判断。【基本思路】 方法一。得到a - b的符号就可以知道a和b哪一个大了。具体过程参照如下代码:int getMax1(int a, int b){ int c = a - b; int scA = sign(c); int scB = flip(scA); return a * sc

2017-09-06 20:44:17 4305

转载 CSDN-markdown语法之如何使用LaTeX语法编写数学公式

目录目录正文标记公式行内公式块级公式上标和下标分数表示各种括号根号表示省略号矢量表示间隔空间希腊字母特殊字符关系运算符集合运算符对数运算符三角运算符微积分运算符逻辑运算符戴帽符号连线符号箭头符号几个例子其它特殊字符字体种类参考文献正文CSDN-markdown编辑器支持基于MathJax编写LaTeX数学公式。MathJax是一款

2017-09-06 20:01:36 428

C语言常见的问题集

1.1 我如何决定使用那种整数类型? 如果需要大数值 (大于 32,767 或小于 −32,767), 使用 long 型。否则, 如果空 间很重要 (如有大数组或很多结构), 使用 short 型。除此之外, 就使用 int 型。如 果严格定义的溢出特征很重要而负值无关紧要, 或者你希望在操作二进制位和字 节时避免符号扩展的问题, 请使用对应的无符号类型。但是, 要注意在表达式中混 用有符号和无符号值的情况。 尽管字符类型 (尤其是无符号字符型) 可以当成 “小” 整型使用, 但由于不可预 知的符号扩展和代码增大有时这样做可能得不偿失。使用无符号字符型有所帮助; 类似的问题参见问题 12.1。 在选择浮点型和双精度浮点型时也有类似的权衡。但如果一个变量的指针必 须为特定的类型时, 以上规则不再适用。

2018-05-22

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

TA关注的人

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