题目描述
有一个员工表employees简况如下:
有一个薪水表salaries简况如下:
请你查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成,以上例子输出为:
比较自连接
1 | select |
有一个员工表employees简况如下:
有一个薪水表salaries简况如下:
请你查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成,以上例子输出为:
1 | select |
给出一组候选数\ C C 和一个目标数\ T T,找出候选数中起来和等于\ T T 的所有组合。
\ C C 中的每个数字在一个组合中只能使用一次。
注意:
示例1
1 | [100,10,20,70,60,10,50],80 |
1 | [[10,10,60],[10,20,50],[10,70],[20,60]] |
1 | 给定的候选数集是[100,10,20,70,60,10,50],目标数是80 |
1 | import java.util.*; |
难度中等569
给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s
获得的 有效 IP 地址 。你可以按任何顺序返回答案。
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0
),整数之间用 '.'
分隔。
例如:”0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、”192.168.1.312” 和 “192.168@1.1“ 是 无效 IP 地址。
示例 1:
1 | 输入:s = "25525511135" |
示例 2:
1 | 输入:s = "0000" |
示例 3:
1 | 输入:s = "1111" |
示例 4:
1 | 输入:s = "010010" |
示例 5:
1 | 输入:s = "101023" |
提示:
0 <= s.length <= 3000
s
仅由数字组成关键点:
1 | class Solution { |
难度困难63
在一个小城市里,有 m
个房子排成一排,你需要给每个房子涂上 n
种颜色之一(颜色编号为 1
到 n
)。有的房子去年夏天已经涂过颜色了,所以这些房子不需要被重新涂色。
我们将连续相同颜色尽可能多的房子称为一个街区。(比方说 houses = [1,2,2,3,3,2,1,1]
,它包含 5 个街区 [{1}, {2,2}, {3,3}, {2}, {1,1}]
。)
给你一个数组 houses
,一个 m * n
的矩阵 cost
和一个整数 target
,其中:
houses[i]
:是第 i
个房子的颜色,0 表示这个房子还没有被涂色。cost[i][j]
:是将第 i
个房子涂成颜色 j+1
的花费。请你返回房子涂色方案的最小总花费,使得每个房子都被涂色后,恰好组成 target
个街区。如果没有可用的涂色方案,请返回 -1 。
示例 1:
1 | 输入:houses = [0,0,0,0,0], cost = [[1,10],[10,1],[10,1],[1,10],[5,1]], m = 5, n = 2, target = 3 |
示例 2:
1 | 输入:houses = [0,2,1,2,0], cost = [[1,10],[10,1],[10,1],[1,10],[5,1]], m = 5, n = 2, target = 3 |
示例 3:
1 | 输入:houses = [0,0,0,0,0], cost = [[1,10],[10,1],[1,10],[10,1],[1,10]], m = 5, n = 2, target = 5 |
示例 4:
1 | 输入:houses = [3,1,2,3], cost = [[1,1,1],[1,1,1],[1,1,1],[1,1,1]], m = 4, n = 3, target = 3 |
提示:
m == houses.length == cost.length
n == cost[i].length
1 <= m <= 100
1 <= n <= 20
1 <= target <= m
0 <= houses[i] <= n
1 <= cost[i][j] <= 10^4
1 | class Solution { |
给你一个n($1\leq n\leq10^5$),和一个长度为n的数组,在不同时选位置相邻的两个数的基础上,求该序列的最大子序列和(挑选出的子序列可以为空)。
示例1
1 | 3,[1,2,3] |
1 | 4 |
1 | 有[],[1],[2],[3],[1,3] 4种选取方式其中[1,3]选取最优,答案为4 |
示例2
1 | 4,[4,2,3,5] |
1 | 9 |
1 | 其中[4,5]的选取方案是在满足不同时选取相邻位置的数的情况下是最优的答案 |
1 | 输入的值在int范围内 |
类似于小偷问题,不能偷相邻位置的元素
学习类似于数学归纳法的思想考虑初始条件:
当数组中只有一个元素时,最大收益是偷这一个
当数组中有两个元素时,最大收益是偷两个中的最大值
当数组中有大于两个元素时,最大收益是dp[i] = Math.max(dp[i-1],dp[i-2]+array[i])
1 | import java.util.*; |
1 | import java.util.*; |
给定一个仅包含数字\ 0-9 0−9 的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。
例如根节点到叶子节点的一条路径是1\to 2\to 31→2→3,那么这条路径就用\ 123 123 来代替。
找出根节点到叶子节点的所有路径表示的数字之和
例如:
这颗二叉树一共有两条路径,
根节点到叶子节点的路径 1\to 21→2 用数字\ 12 12 代替
根节点到叶子节点的路径 1\to 31→3 用数字\ 13 13 代替
所以答案为\ 12+13=25 12+13=25
示例1
1 | {1,0} |
1 | 10 |
示例2
1 | {1,#,9} |
1 | 19 |
1 | import java.util.*; |
给定一个二叉树,请计算节点值之和最大的路径的节点值之和是多少。
这个路径的开始节点和结束节点可以是二叉树中的任意节点
例如:
给出以下的二叉树,
返回的结果为6
示例1
1 | {-2,1} |
1 | 1 |
示例2
1 | {-2,#,-3} |
1 | -2 |
这道题是求树的路径和的题目,不过和平常不同的是这里的路径不仅可以从根到某一个结点,而且路径可以从左子树某一个结点,然后到达右子树的结点,就像题目中所说的可以起始和终结于任何结点。在这里树没有被看成有向图,而是被当成无向图来寻找路径。因为这个路径的灵活性,我们需要对递归返回值进行一些调整,而不是通常的返回要求的结果。在这里,函数的返回值定义为以自己为根的一条从根到子结点的最长路径(这里路径就不是当成无向图了,必须往单方向走)。这个返回值是为了提供给它的父结点计算自身的最长路径用,而结点自身的最长路径(也就是可以从左到右那种)则只需计算然后更新即可。这样一来,一个结点自身的最长路径就是它的左子树返回值(如果大于0
的话),加上右子树的返回值(如果大于0
的话),再加上自己的值。而返回值则是自己的值加上左子树返回值,右子树返回值或者0
(注意这里是“或者”,而不是“加上”,因为返回值只取一支的路径和)。在过程中求得当前最长路径时比较一下是不是目前最长的,如果是则更新。算法的本质还是一次树的遍历,所以复杂度是$O(n)$。而空间上仍然是栈大小$O(logn)$。
1 | import java.util.*; |
给定一个字符串数组,再给定整数k,请返回出现次数前k名的字符串和对应的次数。
返回的答案应该按字符串出现频率由高到低排序。如果不同的字符串有相同出现频率,按字典序排序。
对于两个字符串,大小关系取决于两个字符串从左到右第一个不同字符的 ASCII 值的大小关系。
比如”ah1x”小于”ahb”,”231”<”32“
字符仅包含数字和字母
[要求]
如果字符串数组长度为N,时间复杂度请达到O(N \log K)O(NlogK)
示例1
1 | ["a","b","c","b"],2 |
1 | [["b","2"],["a","1"]] |
1 | "b"出现了2次,记["b","2"],"a"与"c"各出现1次,但是a字典序在c前面,记["a","1"],最后返回[["b","2"],["a","1"]] |
示例2
1 | ["123","123","231","32"],2 |
1 | [["123","2"],["231","1"]] |
1 | "123"出现了2次,记["123","2"],"231"与"32"各出现1次,但是"231"字典序在"32"前面,记["231","1"],最后返回[["123","2"],["231","1"]] |
示例3
1 | ["abcd","abcd","abcd","pwb2","abcd","pwb2","p12"],3 |
1 | [["abcd","4"],["pwb2","2"],["p12","1"]] |
$1 \leq N \leq 10^5$
1 | import java.util.*; |
给定一棵树,求出这棵树的直径,即树上最远两点的距离。
包含n个结点,n-1条边的连通图称为树。
示例1的树如下图所示。其中4到5之间的路径最长,是树的直径,距离为5+2+4=11
示例1
1 | 6,[[0,1],[1,5],[1,2],[2,3],[2,4]],[3,4,2,1,5] |
1 | 11 |
对于此类问题,我们需要构建图来做深度优先搜索。
首先,根据父子关系及边权重构建无向图;
然后,随机找一顶点,利用深度优先搜索找到距离该点最远的顶点remote。
最后,从remote顶点开始深度优先搜索找到最长路径,该路径即为直径。
我们记录每个节点向下,所能延伸的最远距离 $d_1$,和次远距离$d_2$ ,那么直径就是所有$d_1+d_2$ 的最大值。
1 |
|
参考文献
难度简单0
给你一个整数数组 nums
(下标 从 0 开始 计数)以及两个整数 target
和 start
,请你找出一个下标 i
,满足 nums[i] == target
且 abs(i - start)
最小化 。注意:abs(x)
表示 x
的绝对值。
返回 abs(i - start)
。
题目数据保证 target
存在于 nums
中。
示例 1:
1 | 输入:nums = [1,2,3,4,5], target = 5, start = 3 |
示例 2:
1 | 输入:nums = [1], target = 1, start = 0 |
示例 3:
1 | 输入:nums = [1,1,1,1,1,1,1,1,1,1], target = 1, start = 0 |
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 104
0 <= start < nums.length
target
存在于 nums
中1 | class Solution { |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true