分类标签归档:Java算法

java算法-矩形覆盖


题目描述

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

解法

覆盖 2*n 的矩形:

  • 可以先覆盖 2*n-1 的矩形,再覆盖一个 2*1 的矩形;
  • 也可以先覆盖 2*(n-2) 的矩形,再覆盖两个 1*2 的矩形。

解法一:利用数组存放结果

/**
 * @author bingo
 * @since 2018/11/23
 */

public class Solution {
    /**
     * 矩形覆盖
     * @param target 2*target大小的矩形
     *...

阅读全文...

java算法-旋转数组的最小数字


题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组 {3,4,5,1,2}{1,2,3,4,5} 的一个旋转,该数组的最小值为 1

NOTE: 给出的所有元素都大于 0,若数组大小为 0,请返回 0

解法

解法一

直接遍历数组找最小值,时间复杂度 O(n),不推荐。

/**
 * @author bingo
 * @since 2018/10/30
 */

public class Solution {
    /**
     * 获取旋转数组的最小元素
     * @para...

阅读全文...

java算法-跳台阶


题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

解法

跳上 n 级台阶,可以从 n-1 级跳 1 级上去,也可以从 n-2 级跳 2 级上去。所以

f(n) = f(n-1) + f(n-2)
/**
 * @author bingo
 * @since 2018/11/23
 */

public class Solution {
    /**
     * 青蛙跳台阶
     * @param target 跳上的那一级台阶
     * @return 多少种跳法
     */
    publ...

阅读全文...

java算法-变态跳台阶


题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

解法

跳上 n-1 级台阶,可以从 n-2 级跳 1 级上去,也可以从 n-3 级跳 2 级上去...也可以从 0 级跳上去。那么

f(n-1) = f(0) + f(1) + ... + f(n-2) ①

跳上 n 级台阶,可以从 n-1 级跳 1 级上去,也可以从 n-2 级跳 2 级上去...也可以从 0 级跳上去。那么

f(n) = f(0) + f(1) + ... + f(n-2) + f(n-1)  ②

②-①:
f(n) - f(n-1) = f(n...

阅读全文...

java算法-用两个队列实现栈


题目描述

用两个队列来实现一个栈,完成栈的 PushPop 操作。 栈中的元素为 int 类型。

解法

Push 操作,每次都存入 queue1Pop 操作,每次从 queue1 取:

  • queue1 中的元素依次倒入 queue2,直到 queue1 剩下一个元素,这个元素就是要 pop 出去的;
  • queue1queue2 进行交换,这样保证每次都从 queue1 中存取元素,queue2 只起到辅助暂存的作用。
import java.util.LinkedList;
import java.util.Queue;

/**
 * @author bingo...

阅读全文...

java算法-斐波那契数列


题目描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第 n 项(从 0 开始,第 0 项为 0)。n<=39

解法

解法一

采用递归方式,简洁明了,但效率很低,存在大量的重复计算。

f(10)
               /        \
            f(9)         f(8)
          /     \       /    \
       f(8)     f(7)  f(7)   f(6)
      /   \     /   \
   f(7)  f(6)  f(6) f(5)
/**
 * @author ...

阅读全文...

java算法-二叉树的下一个结点


题目描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

解法

对于结点 pNode

  • 如果它有右子树,则右子树的最左结点就是它的下一个结点;
  • 如果它没有右子树,判断它与父结点 pNode.next 的位置情况:
    • 如果它是父结点的左孩子,那么父结点 pNode.next 就是它的下一个结点;
    • 如果它是父结点的右孩子,一直向上寻找,直到找到某个结点,它是它父结点的左孩子,那么该父结点就是 pNode 的下一个结点。
/*
public class TreeLinkNode {
    int v...

阅读全文...

java算法-用两个栈实现队列


题目描述

用两个栈来实现一个队列,完成队列的 PushPop 操作。 队列中的元素为 int 类型。

解法

Push 操作,每次都存入 stack1Pop 操作,每次从 stack2 取:

  • stack2 栈不为空时,不能将 stack1 元素倒入;
  • stack2 栈为空时,需要一次将 stack1 元素全部倒入。
import java.util.Stack;

/**
 * @author bingo
 * @since 2018/10/28
 */

public class Solution {
    Stack<Integer> stack1 = ne...

阅读全文...

java算法-从尾到头打印链表


题目描述

输入一个链表,按链表值从尾到头的顺序返回一个 ArrayList

解法

解法一【推荐】

遍历链表,每个链表结点值 push 进栈,最后将栈中元素依次 poplist 中。

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
import ja...

阅读全文...

java算法-重建二叉树


题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {4,7,2,1,5,3,8,6},则重建二叉树并返回。

解法

在二叉树的前序遍历序列中,第一个数字总是根结点的值。在中序遍历序列中,根结点的值在序列的中间,左子树的结点位于根结点左侧,而右子树的结点位于根结点值的右侧。

遍历中序序列,找到根结点,递归构建左子树与右子树。

注意添加特殊情况的 if 判断。

/**
 * Definition for binary tree
 * public c...

阅读全文...