算法学习
文章平均质量分 59
Chance00
这个作者很懒,什么都没留下…
展开
-
CSP 2017.9 第四题 通信网络 java代码
某国的军队由N个部门组成,为了提高安全性,部门之间建立了M条通路,每条通路只能单向传递信息,即一条从部门a到部门b的通路只能由a向b传递信息。信息可以通过中转的方式进行传递,即如果a能将信息传递到b,b又能将信息传递到c,则a能将信息传递到c。一条信息可能通过多次中转最终到达目的地。 由于保密工作做得很好,并不是所有部门之间都互相知道彼此的存在。只有当两个部门之间可以直接或间接传递信息时,他...原创 2020-05-17 11:50:45 · 397 阅读 · 0 评论 -
剑指offer 二叉树的镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。输入描述: 二叉树的镜像定义:源二叉树 思路:先序遍历,每访问一个节点则交换其左右子树。参考代码: if(root != null) { TreeNode tempNode = root.left; root.left = root.rig...原创 2018-07-06 10:33:59 · 189 阅读 · 0 评论 -
剑指offer 调整数组位置使奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路: 本题稍微麻烦的是要求相对位置不改变,最直观的想法,在偶数后面没发现一个奇数就直接移动该奇数到所有偶数前面。这个方法的问题在于,可能偶数后面有连续多个奇数,可能因此产生大量移动。 ...原创 2018-07-05 12:05:50 · 335 阅读 · 1 评论 -
剑指offer 矩形覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路:首先需要画图确认一下,图形覆盖有什么规律。总结如下表: 这是什么?这是fibonacci数列啊!参考代码:public int RectCover(int target) { if(target <= 0){...原创 2018-07-06 11:30:49 · 188 阅读 · 0 评论 -
剑指offer 从上往下打印二叉树
题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:使用一个ArrayList模拟队列,把根节点加进去,然后每次输出ArrayList的第一个元素,并把该节点的子节点加到ArrayList中。然后从ArrayList移除这个元素。参考代码:import java.util.ArrayList;public class PrintTreeFromTopToB...原创 2018-07-19 10:40:09 · 309 阅读 · 0 评论 -
剑指offer 顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.思路:顺时针打印的方法很简单,只要循环就可以按照圈圈打印了。每次打印一圈都需要一个计数count,方便寻找下一圈的起点。保持...原创 2018-07-15 15:51:50 · 213 阅读 · 0 评论 -
剑指offer 二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路: BST后序遍历的特点,最后一个元素是树的根节点的值。根据根节点的值可以划分左右序列。我们可以采取分治法,不断的提取子序列。对于提取的右序列要检验一下是都都大于根节点的值。参考代码public class Solution {pu...原创 2018-08-04 17:48:55 · 202 阅读 · 0 评论 -
剑指offer 二叉树中和为某一值的路径
题目描述: 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路: 采用先序遍历的方式依次遍历。访问到非叶子节点做好节点值累加和路径记录,访问到叶子结点判定一下至此累加的节点值是否为要判定的整数,若相等,需要备份当前路径并加到最终返回的链...原创 2018-08-20 14:44:36 · 161 阅读 · 0 评论 -
剑指offer最小的k个数
题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。思路:最直观的思路就是采用一个长度为k的数组nums,保证数组里边的数有序,每访问输入数组input的一个节点,将其与nums数组的值最大的元素即nums[nums.length - 1]进行比较,如果input节点更小,则替换。本题也要注意各种异常的排除,包括...原创 2018-09-20 13:17:56 · 251 阅读 · 0 评论 -
面试题 判断数组中是否存在两数和为100
题目: 设计一个算法判断一个数组中是否存在两个整数的和为100。思路: 这个题目可能最直观的想法是先排序,然后通过两个指针一个从前往后一个从后往前移动,寻找合为100的两个整数。但是这个算法的时间复杂度为 O(nlogn),不是很理想。 推荐的思路还是采用HashMap,HashhMap常常能在数组查找类的算法中立神功。先一趟遍历,把所有的整数作为键,出现的次...原创 2018-07-18 15:15:14 · 1585 阅读 · 0 评论 -
剑指offer 栈的压入、弹出序列
题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路: 最直观的思路就是模拟一遍输入结合弹出序列按序弹出。参考代码: ...原创 2018-07-18 10:20:59 · 197 阅读 · 0 评论 -
剑指offer 合并两个排序链表 java代码
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。注意要点 - 不要在定义了新的ListNode节点 后,直接写出下面这种错误写法: ListNode node = null if (list1.val >= list2.val) { node.next = list2 ...原创 2018-06-04 17:37:03 · 277 阅读 · 0 评论 -
剑指offer 重建二叉树 java代码
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路:先序序列的第一个节点是当前子树的根节点,然后遍历中序序列找到这个节点,中序序列的这个节点左边为新的左子树,右边为新的右子树。然后递归实现上述过...原创 2018-06-04 21:08:35 · 606 阅读 · 0 评论 -
剑指offer 两个栈实现队列 java代码
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:只要入栈,全部push到栈1;出栈,当栈2为空,把栈1的数据全部pop到栈2,栈2不空,依次pop栈2即可。public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); S...原创 2018-06-04 21:26:52 · 199 阅读 · 0 评论 -
剑指offer 旋转数组的最小数字 java代码
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:旋转数列可以看做两个有序序列,前一个递增序列的最大值位置的下一位,几位整个数列的最小值的位置。可以采...原创 2018-06-05 10:54:37 · 254 阅读 · 0 评论 -
剑指offer 斐波那契数列
题目描述 斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n&lt;=39思路;最简单的动态规划思路的应用,每一个位置的值都基于前两项的值。自上而下的思考,自下而上的实现。参考代码:public class Fibonacci { public static int fibonacci(int n) { if (n &lt;= 0...原创 2018-06-05 11:11:22 · 155 阅读 · 0 评论 -
剑指offer 二进制中1的个数 java代码
题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:通过数学运算可以发现一个整数a与a-1按位与运算,即a & a-1,如果将结果表示为二进制,相当于将a的二进制形式最右一个1变成0;比如 a=111(b),a-1=110(b), a & a-1 = 110(b)。非常巧妙。参考代码: public static int Number...原创 2018-06-08 14:55:32 · 343 阅读 · 0 评论 -
剑指offer 包含min函数的栈
题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数。思路: 定义新数据结构的思路通常都是基于已有数据结构做改造。除了原始的栈,此处需要再使用一个辅助栈和辅助变量,用来存储当前栈里面的最小值,在每次往原始栈push值的时候,同时也要更新一个min值,用来添加到min栈里面。反之,原始栈栈pop的时候也要更新一下min值和min栈参考代码:impor...原创 2018-07-17 10:31:51 · 212 阅读 · 0 评论 -
剑指offer 链表中倒数第k个节点
题目描述 输入一个链表,输出该链表中倒数第k个结点。思路: 先指定一个变量pointer走k-1个节点,然后head和pointer同时移动,直到pointer走到尾节点。本题一个陷阱在于如何解决异常问题。包括,k为负值,k大于链表长度,链表为空。参考代码: public ListNode FindKthToTail(ListNode head,int k) { if ...原创 2018-07-05 13:35:40 · 185 阅读 · 0 评论 -
剑指offer 数值的整数次方 java代码
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路:首先先考虑特殊输入,考虑特殊的输入值,这里把0的负数次方定义为返回值为0,把0的0次方定位为1。为了保证效率,这里采用 “>>1”作为除2的方式,因为2进制移位效率更高,下边用“exponent & 0x01 == 1”确定奇数偶数也是为了提升效率...原创 2018-04-30 19:55:19 · 262 阅读 · 0 评论