
算法
QueenieK
这个作者很懒,什么都没留下…
展开
-
返回乱序数组中第k大的数
类似于快速排序,执行一次快速排序之后,每次只选择一部分继续执行快速排序,直到找到第K大个元素为止,这个元素在数组位置后面的元素即为所求。 利用快速排序子过程的返回哨兵的位置,将哨兵的序号和k - 1进行比较 时间复杂度:O(n)public class ChangeQuickSort { public static int sort(int arr[], int low, ...原创 2018-05-26 11:17:58 · 582 阅读 · 0 评论 -
有序数组翻转后的查找
题目:Suppose a sorted array is rotated at some pivot unknown to you beforehand.(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).You are given a target value to search. If found in the array return...转载 2018-05-25 15:32:30 · 2851 阅读 · 0 评论 -
连续子数组最大和
求连续子数组的最大和,数组元素有正有负。public class Solution { public int FindGreatestSumOfSubArray(int[] array) { if(array.length == 0 || array == null) return 0; int maxSum = Integer....原创 2018-05-06 19:19:54 · 210 阅读 · 0 评论 -
把二叉树打印成多行
题目描述: 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。分析:利用层次遍历的算法,设置变量last指向当前层的最后一个节点,设置变量count记录当前层已经访问的节点的个数,当count等于last时,表示该层访问结束。层次遍历在求树的宽度、输出某一层节点,某一层节点个数,每一层节点个数都可以采取类似的算法。树的宽度:在树的深度算法基础上,加一个记录访问过的...原创 2018-04-11 21:44:57 · 137 阅读 · 0 评论 -
对称二叉树
题目描述: 请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。分析: 首先根节点以及其左右子树,左子树的左子树和右子树的右子树相同; 左子树的右子树和右子树的左子树相同即可,采用递归.public class Solution { boolean isSymmetrical(TreeNode pRoot) ...原创 2018-04-11 21:07:03 · 127 阅读 · 0 评论 -
二叉搜索树的第k大结点
题目描述:给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。分析: 二叉搜索树按照中序遍历的顺序打印出来正好就是排序好的顺序。 所以,按照中序遍历顺序找到第k个结点就是结果。public class Solution { int index = 0; TreeNod...原创 2018-04-11 19:57:33 · 232 阅读 · 0 评论 -
二叉树的下一个结点
题目描述: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。分析: 1.二叉树为空,则返回空; 2.结点有右子树,则中序遍历的下一个结点为右子树上的最左结点; 3.结点没有右子树,如果该结点是父结点的左孩子,则返回该结点的父节点;否则继续遍历父节点的父节点,重复判断,返回结果.代码:pub...原创 2018-04-11 16:48:51 · 110 阅读 · 0 评论 -
平衡二叉树
题目: 输入一棵二叉树,判断该二叉树是否是平衡二叉树。分析1: 根据求得二叉树深度的算法,我们可以在遍历每一个节点时直接调用二叉树深度函数TreeDepth,只要每个节点的左右子树的深度之差不超过1,说明为平衡二叉树。 此方法节点遍历重复,效率低,非面试官喜欢。public class Solution { public int TreeDepth(TreeNode ...原创 2018-04-11 15:35:28 · 131 阅读 · 0 评论 -
二叉树中和为值的路径
题目: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。分析: 借助ArrayList< ArrayList < Integer >>存储多条路径。内部链表为arrList,外部链表为arrListAll。 1.当前遍历节点为空,直接返回arrListAll;当前节点不为空...原创 2018-04-11 10:47:21 · 246 阅读 · 0 评论 -
二叉搜索树的后序遍历
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。分析: 二叉搜索树定义:一个二叉树,它的每个节点都不比它左子树的任意元素小,而且不比它的右子树的任意元素大。 在后续遍历得到的序列中,最后一个数字是树的根节点的值。数组中前面的数字可以分成两部分:第一部分是左子树节点的值,他们都比根节点的...原创 2018-04-10 20:40:48 · 165 阅读 · 0 评论 -
顺时针打印矩阵
题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. - 分析:用左上和右下的坐标定位出一次要旋转打印的数据,一次旋转打印结束后,往对角分别前进和后退一个单位。 ...原创 2018-04-10 16:41:42 · 104 阅读 · 0 评论 -
栈的压入、弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)分析: 借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是1,然后判...原创 2018-04-10 15:24:32 · 98 阅读 · 0 评论 -
从上往下打印二叉树
题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印。分析: 相当于树的层次遍历,借助队列实现。代码:import java.util.Queue;import java.util.ArrayList;import java.util.LinkedList;public class Solution { public ArrayList<Inte...原创 2018-04-10 09:33:23 · 144 阅读 · 0 评论 -
树的子结构
题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)分析 将原始问题分为两个子问题 a. 在树A中寻找和树B根节点的值一样的结点node b. 判断在树A中以node为根节点的子树,是否和树B拥有一样的结构 代码/**public class TreeNode { int val = 0; TreeNode ...原创 2018-04-09 21:33:33 · 113 阅读 · 0 评论 -
二叉树镜像
题目描述: 操作给定的二叉树,将其变换为源二叉树的镜像分析: 左节点和右节点交换;然后实现左右子树的递归。代码:/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { ...原创 2018-04-09 20:23:10 · 174 阅读 · 0 评论 -
数值的整数次方
题目描述: 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。分析: 方法一、 若指数大于0,直接递归求得,即base*Power(double base, int exponent);若指数小于0,求得指数绝对值exponent1,求得最后结果倒数,即1/(base * Power(base, exponent1 - 1))....原创 2018-04-09 12:47:15 · 141 阅读 · 0 评论 -
调整数组奇数与偶数顺序
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。分析 1.第一种方法: 类似于冒泡排序,将一次排序将前奇后偶交换。 2.第二种方法: (1)新建一个数组; (2)统计奇数个数; (3)设置两个指针,奇数从0开始,偶数从奇数个数开始,对新数组进行填...原创 2018-04-08 21:28:24 · 482 阅读 · 0 评论 -
矩形覆盖
题目描述:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?分析: 当n<1时,无 当n=1时,只有一种方法; 当n=2时,横着或者竖着有两种方法; 当n>2时,若第一个竖着覆盖,则剩下的为f(2*(n-1))方法;若第一个横着覆盖,则与其平行覆盖还需要一个,则剩下的为f(2*(n-2))种方...原创 2018-04-08 19:45:18 · 125 阅读 · 0 评论 -
链表中的倒数第k个结点
题目描述:输入一个链表,输出该链表中倒数第k个结点。分析:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指针走(k-1)步,到达第k个节点。然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了。代码:/*public class ListNode { int val; ListNode next =...原创 2018-04-08 16:46:15 · 111 阅读 · 0 评论 -
重建二叉树
题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 分析:代码:/** * Definition for binary tree * public class TreeNode { *...原创 2018-04-07 18:41:16 · 157 阅读 · 0 评论 -
旋转数组的最小数值
题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 分析: 1.如果发生旋转,前面的数至少去了一个放在数组的后面;1)旋转后,数组分为两个排序数组,而...原创 2018-04-07 16:27:04 · 128 阅读 · 0 评论 -
用两个栈实现队列
题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 分析: 将元素全部进栈stack1,stack1依次出站再进栈stack2,stack2栈中元素顺序出栈则实现队列顺序。注意判断条件。 代码:import java.util.Stack;public class Solution { Stack<Integer> ...原创 2018-04-07 15:40:55 · 189 阅读 · 0 评论 -
变态跳台阶
题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 分析: 1.有n的台阶,第一步的跳法有:跳1阶、跳2阶,…跳n阶; 2.跳1阶,剩下n-1,剩下的跳法f(n-1); 3.跳2阶,剩下n-2,剩下的跳法f(n-2); 4.f(n)=f(n-1)+f(n-2)+f(n-3)+…+f(1) f(n-1)=f(n...原创 2018-04-07 11:51:30 · 128 阅读 · 0 评论 -
跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 暴力搜索: 运行时间:500mspublic class Solution { public int JumpFloor(int target) { if(target <= 2) return target; retu...原创 2018-04-07 11:02:22 · 155 阅读 · 0 评论 -
替换空格
题目描述: 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 解题思路: 问题1:替换字符串,是在原来的字符串上做替换,还是新开辟一个字符串做替换! 问题2:在当前字符串替换,怎么替换才更有效率(不考虑java里现有的replace方法)。 从前往后替换,后面的字符要不断...原创 2018-04-06 21:11:45 · 111 阅读 · 0 评论 -
二维数组中的查找
题目描述: 解题思路: 方法1:遍历public class Solution { public boolean Find(int target, int [][] array) { if(array.length<=0){ return false; } for(...原创 2018-04-06 19:29:55 · 121 阅读 · 0 评论 -
二叉树的深度
题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { ...原创 2018-04-06 11:15:05 · 144 阅读 · 0 评论 -
棋盘
题目描述:请编写一个函数(允许增加子函数),计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。解题思路: 1、变成子问题:最左上角的可以看成点(n,m),最右下角看成(0,0);从点(n,m)向下走一步,后面就是子问题(n-1,m)的解;从点(n,m)向右走一步,后面...原创 2018-04-06 09:49:16 · 300 阅读 · 0 评论 -
求1+2+3+...+n
题目描述: 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。方法一:需利用逻辑与的短路特性实现递归终止。 ans==true时,递归Sum_Solution(n-1),只执行int sum=n,sum依次等于n为5,4,3,2,1,0. 当ans==false,执行return sum,开始回溯。...原创 2018-04-05 16:47:36 · 182 阅读 · 0 评论 -
n的阶乘-递归-动态规划
递归:public class Factorial { public int factorial(int n){ if(n<0) return -1; else if(n==0) return 1; return n*factorial(n-1); } public s...原创 2018-04-05 16:10:17 · 1697 阅读 · 1 评论 -
斐波那契数列-动态规划
递归方法: 运行时间:1171ms 占用内存:9492k 时间复杂度O(2n)O(2n)O(2^n)public class Solution { public int Fibonacci(int n) { if(n<=1) return n; return Fibonacci(n-1)+Fibonacci(n-2...原创 2018-04-04 19:47:54 · 330 阅读 · 0 评论 -
LeetCode-198:打家抢劫
题目描述: 你是一个专业的强盗,计划抢劫沿街的房屋。每间房都藏有一定的现金,阻止你抢劫他们的唯一的制约因素就是相邻的房屋有保安系统连接,如果两间相邻的房屋在同一晚上被闯入,它会自动联系警方。给定一个代表每个房屋的金额的非负整数列表,确定你可以在没有提醒警方的情况下抢劫的最高金额。方法一、 暴力搜索: 思路:文中给出不能连续抢两家,因此假设从最后一个房屋开始抢,最后一个房屋为idx。将原...原创 2018-04-04 16:22:58 · 513 阅读 · 0 评论 -
斐波那契数列
题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 斐波那契数列满足:F(n)=F(n-1)+F(n-2).public class Solution { public int Fibonacci(int n) { if(n<=1) return n; int a=0; ...原创 2018-04-03 21:36:52 · 144 阅读 · 0 评论 -
给定数字在排序数组中出现的次数
题目描述:统计一个数字在排序数组中出现的次数。 可以根据二分查找,查找给定元素第一次出现的位置,往后继续查找值是否相等,寻找出现次数。public class Solution { public int GetNumberOfK(int [] array , int k) { int low = 0; int high = array.length - ...原创 2018-04-03 17:06:16 · 556 阅读 · 0 评论 -
二进制中1的个数
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 算法思路:如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。 举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位...原创 2018-04-03 16:44:38 · 127 阅读 · 0 评论 -
两个链表的第一个公共结点
两个链表的第一个公共结点两个链表第一个公共结点后都是公共结点,呈Y型,非X型。也就是说两个链表在第一个节点重合之后不会再分开了 方法一:利用两个链表的长度差/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val...原创 2018-04-03 16:26:53 · 121 阅读 · 0 评论 -
链表中的入口结点
题目描述:一个链表中包含环,请找出该链表的环的入口结点。 算法解决思路: 一、判断链表是否含有环 1)选择快慢指针,让快指针每次走两步,慢指针每次走一步,若是单链表中有环的话,那么两个指针会相遇,即指向的相同的节点的值相等来判断。2)当相遇的时候,慢指针在环中走了k步,设环之外的部分长为x,环的长度为n,则快指针一共走了 x+m*n步,(m为快指针在环中走的圈数),慢指针一共走了x+k步...原创 2018-04-03 15:19:10 · 169 阅读 · 0 评论 -
判断链表是否有环
算法思想: 令p1指向头结点,p2指向头结点的下一个结点;每次p1向后移动一个结点,p2向后移动两个结点;若p1的值等于p2的值,则链表有环。public boolean hasCycle(ListNode head){ ListNode p1=head; //p1指向头结点 ListNode p2=head.next; //p2指向...原创 2018-04-03 14:04:52 · 117 阅读 · 0 评论 -
合并两个排序的链表
合并两个排序链表函数功能:已经排好序的两个链表,合并成一个有序链表递归方式:public ListNode Merge(ListNode listNode1, ListNode listNode2) { if (listNode1 == null) return listNode2; if (listNode2 == null...原创 2018-04-02 16:47:39 · 166 阅读 · 0 评论 -
快速排序
快速排序/** * Created by kqq on 2018/3/24. */public class QuickSort { public int partition(int arr[],int low,int high){ int key=arr[low]; while(low<high){ while(a...原创 2018-04-01 19:20:44 · 115 阅读 · 0 评论