摘要:题目 给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明。请返回最后获胜者的分数。 例子 arr=[1,2,100,4]。 开始时玩家A只能拿走1或4。如果玩家A拿走1,
阅读全文
摘要:题意 给定一个整形数组arr,返回排序后的相邻两数的最大差值。 题解 借助桶排序思想。 首先遍历一遍获得最大值max,最小值min。 设数组长度为len,则有len+1个桶,桶负责的区间大小是(max min)/len,数字num放入的桶id是(num min)/((max min)/len)即(n
阅读全文
摘要:题目 补充问题:数组只含0,1,2,对数组排序,要求时间复杂度O(n),额外空间复杂度O(1) 题解 维护三个变量,l,idx,r。左区间[0,l],中间区间[l+1,idx],右区间[idx+1,r]。 初始化l= 1,r=len,idx=0。idx用来遍历数组。 当arr[idx]=1,idx+
阅读全文
摘要:题目描述 定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N 1)时,如果arr[0]arr[mid 1],那么区间缩小为[l,mid 1]; (因为不满足上一条,试着画一画,可判定新的区间有局部最小) 如果不满足上一条,且arr[mid]mid 1) { r=mid
阅读全文
摘要:问题描述 给定数组,输出所有子数组的累积的最大值。 题解 以arr[i]结尾的最大累乘积=max{max arr[i],min arr[i],arr[i]},其中max、mini表示以arr[i 1]结尾的最大累乘积、最小累乘积。 最后再取一个最大值即可。 时间复杂度O(n) 代码
阅读全文
摘要:###题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数。 ###题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 || k > lenShort + lenLong,无。 k ⇐ lenShort,在两个数组前k个做二分。 k
阅读全文
摘要:题目描述 给定两个有序(升序)数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。 根据例子,上中位数指若有两个中位数,则较小的那一个是上中位数。 题解 分类讨论。结合使用二分,两个数组分别维护l、r、mid指针。 arr1[mid1]=arr2[mid2],直接返回结果
阅读全文
摘要:题意 给定一个单向链表的头节点head,节点的值类型是整型,再给定一个整数k。实现一个调整链表的函数,将链表调整为左部分都是值小于k的节点,中间部分都是值等于k的节点,右部分都是值大于k的节点。 在左、中、右三个部分的内部也做顺序要求,要求每部分里的节点从左到右的顺序与原链表中节点的先后次序一致。
阅读全文
摘要:问题描述 Node类中的value是节点值,next指针和正常单链表中next指针的意义一样,都指向下一个节点,rand指针是Node类中新增的指针,这个指针可能指向链表中的任意一个节点,也可能指向null。 给定一个由Node节点类型组成的无环单链表的头节点head,请实现一个函数完成这个链表中所
阅读全文
摘要:题目描述 给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点。 题解 内部函数reverse实现链表beg到end的翻转,以及与l和r的连接。 外部函数reverseKNodes实现区间的移动(即四个实参的更新),以及整
阅读全文
摘要:题意 32位有符号整型num,返回该整数二进制数中1的个数。 题解 法一:循环次数等于位数 移位 补0右移 右移(负数时高位补1) 法二:循环次数等于1的个数 抹掉最右边的1 法三:循环次数等于1的个数 获得最右边的1 todo 平行算法待搞懂 代码(法一、二、三)
阅读全文
摘要:题目描述 从N个元素中随机抽取k个元素,但的k个数无法事先确定。 在实际应用中,往往会遇到很大数据流的情况。因此,我们无法先保存整个数据流然后再从中选取,而是期望有一种将数据流遍历一遍就得到所选取的元素,并且保证得到的元素是随机的算法。 特别地,此题元素为1 N。 解题思路 蓄水池算法。 1. 先选
阅读全文
摘要:题目 给定数组arr和整数num,求数组的子数组中有多少个的满足“最大值减去最小值 maxQue = new LinkedList(); LinkedList minQue = new LinkedList(); int i = 0; int j = 0; while (i = arr[j]) {
阅读全文
摘要:问题描述 如题。 输入 栈12345 输出 栈54321 解题思路 用两个递归函数: 第一个可以将栈底元素弹出 第二个借助第一个可以实现栈逆序 代码
阅读全文
摘要:问题描述 字符串str,模式串exp。 必须保证str中无'.'和'星号'字符,并且exp中'星号'不出现在首位,且无连续两个'星号'。PS星号是字符只是暂时没找到markdown的星号转义字符。 '.'可以匹配任意一个字符,'星号'可以匹配0 多个星号前面的一个字符的情况。 输出可否匹配。 例:
阅读全文
摘要:问题描述 给定一个数组,找到每一个位置左边和右边离它最近的且值比它小的位置,返回一个二维数组表示每个位置对应的两个位置。 解题思路 使用单调栈,保证栈内元素从栈顶到栈底严格单调递减。 每个元素入出栈一次,时间复杂度O(n) 具体的,如果x位置被弹出,在栈中位于ta下面的位置的元素就是满足题意的左边元
阅读全文
摘要:问题描述 输入数组arr={4,3,5,4,3,3,6,7},窗口大小w=3,窗口由左向右移动,输出每个窗口最大值组成的数组。 解题思路 数据结构:使用LinkedList模拟双端队列,LinkedList底层是双向链表。 遍历一遍arr,时间复杂度O(n)。具体地, 队列队尾的位置对应的元素若不比
阅读全文
摘要:问题描述 给定一个字符串,输出把它全部切成回文子串的最小分割数。 例:str="ACDCDCDAD",输出2。 解题思路 DP 存储结构 dp数组dp[len+1],dp[i]表示子串str[i:len]至少需要切割几次,才能都切割成回文串。 对应的,循环从右至左进行。 注意 dp[i]的含义完全可
阅读全文
摘要:问题描述 小和定义: 例如:数组s = [1, 3, 5, 2, 4, 6],在s[0]的左边小于或者等于s[0]的数的和为0,在s[1]的左边小于或等于s[1]的数的和为1,在s[2]的左边小于或等于s[1]的数的和为1+3=4……将所有位置的左边比它小或者等于的数的和相加起来就是小和。 s的小和
阅读全文
摘要:问题描述 输入 原字符串StrOrg,目标字符串StrTarget,插入、删除、替换的编辑代价ic,dc,rc。输出将原字符串编辑成目标字符串的最小代价。 解题思路 状态表示 dp[i][j]表示把strOrg[0:i]编辑成strTarget[0:j]的最小代价。 状态转移方程 从以下三种状态的取
阅读全文