随笔分类 - 算法题目总结
摘要:著名的约瑟夫杀人问题 哈哈哈哈 解读: 输入:一个环型单向链表的头节点head和报数m 返回: 最后生存下来的节点,并且这个节点自己组成环形单向链表,其他的节点都删掉 进阶问题: 如果链表节点数为N,想在时间复杂度为O(N)时完成原问题的要求,咋办? 普通解法: 如果链表为空或者节点数为1 或者m<
阅读全文
摘要:给定单链表的表头节点head, 以及两个整数from 和 to, 在单向链表上把fro个节点到第to个节点这一部分进行反转 思路: 本题 有可能存在换头的问题,所以函数应该返回调整后的新的头节点 1 判断是否满足 1<=from<=to<=N 如果不满足,直接返回原来的头节点 2 找到第from-1
阅读全文
摘要:分别实现反转单向和双向链表的函数 看代码: 可以用栈实现: 反向双向链表 调节指针的算法:
阅读全文
摘要:给定链表的表头节点head,实现删除链表的中间节点的函数 推展: 给定链表的头节点,整数a 和 整数 b,实现删除a/b处节点的函数 先来分析原问题, 长度1 直接返回 长度2 将头节点删除 长度3 删除第二个 长度4 删除第二个 长度5 删除第三个。。。。。。长度每增加2 删除的节点就向后移动一个
阅读全文
摘要:分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 当链表走到头时候 如果k值大于0 说明不用调整 因为链表根本没有倒数第k个节点 此时将原链表直接返回即可
阅读全文
摘要:给定两个有序链表的头指针 head1 和 head2,打印两个链表的公共部分 思路: 有序嘛, 如果head1 的值小于 head2, head1往下移动 如果head2的值小于head1,head2往下移动 如果相等,打印这个值,然后同时向下移动 两个有一个为null, 整个过程停止
阅读全文
摘要:给定一个无序整型数组arr,找到数组中未出现的最小正整数 解题思路非常好,需要好好学习一下,很逻辑 如果arr长度为N, 最优解可以做到时间复杂度O(N) 额外空间复杂度O(1) 1、遍历arr之前生成两个变量, l r 初始值 l=0 r=N 2、从左到右遍历arr,arr[l] 3、如果arr[
阅读全文
摘要:给定一个数组arr, 其中只可能有 0,1,2三个值,请实现arr排序 另一种问法: 有一个数组,只有红 蓝 黄 球,请事先红球全放在数组的左边,蓝球放中间,黄球放右边 另一种问法: 有一个数组,再给定一个值K, 请实现比k小的数都放在数组的左边,等于k的放中间,大于k的放右边 思路: 生成变量le
阅读全文
摘要:给定一个有序数组arr, 调整arr使得这个数组的左半部分没有重复元素且升序,而且不用保证右边是否有序 分区就ok了 u区是 无重复且升序的 u是这个区域的最后位置,初始u=0 i做从左到右的遍历,在arr[u+1....i]上是不保证没有重复元素且升序的区 i是这个区域的最后位置 i向右移动 因为
阅读全文
摘要:给定一个整型数组arr,返回不包含本位置的乘数组 一般做法是用除法,新方法: 一个位置上 除去 自己值的累乘,就是自己左边的累乘再乘以自己右边的累乘,即 res[i]=lr[i-1]*rl[i+1] 最左的位置 和 最右的位置 比较特殊, 即 res[0]=rl[1] , res[N-1]=lr[N
阅读全文
摘要:要是知道了i-1结尾的最小累乘积min ,最大累乘积max, 那么y结尾的最大累乘积有三种可能 max * arr[i] min * arr[i] arr[i] 具体过程看代码实现:
阅读全文
摘要:给定无序数组arr, 已知arr中任意连个相邻的数都不相等。 写一个函数,只需返回arr中任意一个局部最小出现的位置 本题利用二分查找 1 如果arr为空后者长度为0,返回-1 2 如果arr长度为1或者arr[0]<arr[1] 返回0 3 如果arr[N-1] < arr[N-2] 返回N-1
阅读全文
摘要:给定一个矩阵matrix, 其中的值有正 负 0 ,返回子矩阵的最大累加和 这个是 子数组最大累加和问题的 升级版 看例子就懂了: 如果只有两行,那么 上下两行相加,得出列加数组 得出最大累加和 总结整个过程,关键之处在于: 用求累加数组的最大累加和是的的方式得到每一步的最大子矩阵的累加和 每一步的
阅读全文
摘要:给定一个数组arr, 返回子数组的最大累加和 要求 如果长度为N 要求时间复杂度O(N) 额外空间复杂度O(1) 解题思路: 如果没有正数 产生的最大累加和一定是 数中最大的那个 如果有正数 遍历到正数增加 遍历到负数减小 当小于0时候 说明累加到当前数出现了小于0的结果,那么累加的这一部分肯定不能
阅读全文
摘要:给定一个长度不小于2的数组arr,实现一个函数调整arr, 要么让所有的偶数下标都是偶数,要么让所有奇数下标都是奇数 这道题 在不停的交换和判断中 走向了成功 初始值 enven =0 odd=1 每次交换完了对应的 +2 看代码,一目了然:
阅读全文
摘要:给定一个长度为N的整型数组arr, 其中只有N个互不相等的自然数 1~N 请实现 arr的排序, 但是不要把下标0~N-1位置上的数通过直接赋值的方法替换成 1~N 分析: arr在调整之后应该是下表从 0 到 N-1的位置上以此放着1~N 即 arr[index] = index+1 从左到右遍历
阅读全文
摘要:一个数组中 每个元素左边比他小的和 然后都加起来 这个题目非常牛逼,可以用归并加速法,在归并的过程中做文章!!! 代码展示: 结果:
阅读全文
摘要:给定一个无序数组arr,其中元素可正、可负、可0,给定一个整数k,求arr所有的子数组中累加和小于或等于k的最长子数组长度。 例如: arr=[3,-2,-4,0,6] , k=-2, 相加和小于或者等于-2的最长子数组为{3,-2,-4,0}, 所以结果返回4 解题思想(我称之为预处理思想): 预
阅读全文
摘要:可正 负 0 的数组,给定一个正整数k 求arr 所有子数组中累加和为k的最长子数组问题 s(i) 代表前i个元素的和,那么子数组arr[i.....j]的累加和为 s(i)-s(j-1) 这是题目的核心!!! 这样原问题解法,只遍历一遍。 设置map key表示此处的sum值 value表示出现的
阅读全文
摘要:例如 arr=[1,2,1,1,1] k=3 累加和为 3的最长子数组为[1,1,1] 所以结果为3 思路方法: 两个指针 left 和right 初始值都是0 都在左边 sum 代表 子数组 left.....right的和 len 一直记录累加和为k的所有子数组中最大子数组的长度 根据 sum与
阅读全文