分类标签归档:Java

java算法-平衡二叉树


题目描述

输入一棵二叉树的根结点,判断该树是不是平衡二叉树。

如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

注意:

  • 规定空树也是一棵平衡二叉树。

样例

输入:二叉树[5,7,11,null,null,12,9,null,null,null,null]如下所示,
    5
   / \
  7  11
    /  \
   12   9

输出:true

解法

解法一

求每个节点左右孩子的深度,判断该节点是否平衡。

这种方法需要重复遍历节点多次,不推荐。

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

...

阅读全文...

java算法-数组中只出现一次的两个数字


题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。

请写程序找出这两个只出现一次的数字。

你可以假设这两个数字一定存在。

样例

输入:[1,2,3,3,4,4]

输出:[1,2]

解法

如果数组有一个数字出现一次,其它数字都出现两次。那么我们很容易通过异或 ^ 运算求出来。

而现在是有两个数字出现一次,那么我们考虑一下怎么将这两个数字隔开,之后我们对隔开的数组分别进行异或,不就求出来了?

我们先异或,求得的结果是两个不相同的数字异或的结果,结果一定不为 0。那么它的二进制表示中一定有 1。我们根据这个 1 在二进制中出现的位置。将数组划分,这样,两个只出现一次的数字就会...

阅读全文...

java算法-数组中数值和下标相等的元素


题目描述

假设一个单调递增的数组里的每个元素都是整数并且是唯一的。

请编程实现一个函数找出数组中任意一个数值等于其下标的元素。

例如,在数组 [-3, -1, 1, 3, 5] 中,数字 3 和它的下标相等。

样例

输入:[-3, -1, 1, 3, 5]

输出:3

注意:如果不存在,则返回 -1。

解法

二分法查找。

  • 当前元素等于对应的下标,直接返回该下标;
  • 当前元素大于该下标,在左边查找;
  • 当前元素小于该下标,在右边查找。
/**
 * @author bingo
 * @since 2018/12/10
 */

class Solution {
    /**
     *...

阅读全文...

java算法-二叉树的深度


题目描述

输入一棵二叉树的根结点,求该树的深度。

从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

样例

输入:二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]如下图所示:
    8
   / \
  12  2
     / \
    6   4

输出:3

解法

递归即可。

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

/**
 * Definition for a binary tree node.
 * public clas...

阅读全文...

java算法-两个链表的第一个公共结点


题目描述

输入两个链表,找出它们的第一个公共结点。

样例

给出两个链表如下所示:
A:        a1 → a2
                   ↘
                     c1 → c2 → c3
                   ↗            
B:     b1 → b2 → b3

输出第一个公共节点c1

解法

先遍历两链表,求出两链表的长度,再求长度差 |n1 - n2|

较长的链表先走 |n1 - n2| 步,之后两链表再同时走,首次相遇时的节点即为两链表的第一个公共节点。

/**
 * @author bingo
 * @sin...

阅读全文...

java算法-数字在排序数组中出现的次数


题目描述

统计一个数字在排序数组中出现的次数。

例如输入排序数组 [1, 2, 3, 3, 3, 3, 4, 5] 和数字 3,由于 3 在这个数组中出现了 4 次,因此输出 4。

样例

输入:[1, 2, 3, 3, 3, 3, 4, 5] ,  3

输出:4

解法

找出第一个 k 和最后一个 k 出现的位置。

找第一个 k 时,利用二分法,如果 nums[m] == k,判断它的前一个位置是不是也是 k,如果不是,说明这是第一个 k,直接返回。如果是,那么递归在左边查找第一个 k。

找最后一个 k 也同理。

/**
 * @author bingo
 * @since 2018/1...

阅读全文...

java算法-0到n-1中缺失的数字


题目描述

一个长度为 n-1 的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围 0n-1 之内。

在范围 0n-1n 个数字中有且只有一个数字不在该数组中,请找出这个数字。

样例

输入:[0,1,2,4]

输出:3

解法

找出第一个与下标不对应的数字即可。

特殊情况:

  • 下标都对应,那么应该返回 最后一个数+1
  • 缺失的数字是第一个,那么返回 0。
/**
 * @author bingo
 * @since 2018/12/8
 */

class Solution {
    /**
     * 获取0~n-1缺失的数字
     *
     * ...

阅读全文...

java算法-礼物的最大价值


题目描述

在一个 m×n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。

你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或者向下移动一格直到到达棋盘的右下角。

给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?

解法

写出递推式,res 表示获得的最大礼物。

res[i][j] = Math.max(res[i - 1][j], res[i][j - 1]) + grid[i][j];
/**
 * @author bingo
 * @since 2018/12/8
 */

class Solution {
    /**
     * 获取礼...

阅读全文...

java算法-最长不含重复字符的子字符串


题目描述

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

假设字符串中只包含从 az的字符。

解法

动态规划。

res[i] 表示以 s[i] 字符结尾的最长不重复字符串的长度。判断 s[i]

  • s[i] 在前面没出现过,那么 res[i] = res[i - 1] + 1
  • s[i] 在前面有出现过,判断它上一次出现的位置 indexi 的距离 dres[i - 1] 的大小关系:
    • d <= res[i - 1],说明它被包含在 res[i - 1] 构成的子串中,那么 res[i] = d
    • d > re...

阅读全文...

java算法-把数组排成最小的数


题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

例如输入数组 [3, 32, 321],则打印出这3个数字能排成的最小数字321323

解法

import java.util.Arrays;

/**
 * @author bingo
 * @since 2018/12/8
 */

class Solution {

    /**
     * 打印数组元素组成的最小的数字
     *
     * @param nums 数组
     * @return 最小的数字
     */
    public String p...

阅读全文...