面试算法题
大厂高频面试算法题,包含 牛客网,LeetCode ,剑指 Offer 的题解,支持 Java ,和 Go 两种方式进行解题
wangxiaoming
博客是很好的总结和记录工具,如果有问题,来不及回复,关注程序员奇点,获取我的联系方式,向我提问,也可以给我发送邮件,联系 [email protected]
展开
-
LeetCode 347 前 K 个高频元素
前 K 个高频元素给定一个非空的整数数组,返回其中出现频率前 k 高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]class Solution { public int[] topKFrequent(int[] nums, int k) { int len = nums.length; Map<Integer,Integer.原创 2021-04-27 10:21:57 · 71 阅读 · 0 评论 -
LeetCode 1047. 删除字符串中的所有相邻重复项 - Go 实现
删除字符串中的所有相邻重复项给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例:输入:“abbaca”输出:“ca”解释:例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “c.原创 2021-03-09 11:48:40 · 174 阅读 · 0 评论 -
LeetCode 132. 分割回文串 II
分割回文串 II给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。返回符合要求的 最少分割次数 。示例 1:输入:s = “aab”输出:1解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。示例 2:输入:s = “a”输出:0示例 3:输入:s = “ab”输出:1提示:1 <= s.length <= 2000s 仅由小写英文字母组成思路dp[j] = min(dp[j], dp[i] + 1), 其中 .原创 2021-03-08 17:51:49 · 139 阅读 · 0 评论 -
LeetCode 131. 分割回文串 - Go 实现
分割回文串给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。示例 1:输入:s = “aab”输出:[[“a”,“a”,“b”],[“aa”,“b”]]示例 2:输入:s = “a”输出:[[“a”]]提示:1 <= s.length <= 16s 仅由小写英文字母组成思路回溯法, 长度为1 分割,然后长度为2 分割,依次循环回溯,删除最后一个AC 代码func p.原创 2021-03-08 16:10:41 · 211 阅读 · 0 评论 -
leetCode 232. 用栈实现队列
用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from to.原创 2021-03-05 10:48:40 · 122 阅读 · 1 评论 -
LeetCode 354. 俄罗斯套娃信封问题
俄罗斯套娃信封问题给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。说明:不允许旋转信封。示例:输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]输出: 3解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] =>.原创 2021-03-04 17:10:29 · 132 阅读 · 1 评论 -
LeetCode 7. 整数反转 - Go 实现
整数反转给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。思路两个关键的地方,就是最大最小值其次就是循环遍历,累加AC 代码func reverse(x int) int { ans := 0 for x != 0{ pop := x%10 if ans >.原创 2021-03-03 10:25:13 · 151 阅读 · 0 评论 -
LeetCode 338. 比特位计数 - Go 实现
比特位计数给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例 2:输入: 5输出: [0,1,1,2,1,2]进阶:给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?要求算法的空间复杂度为O(n)。你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __.原创 2021-03-03 09:50:37 · 167 阅读 · 0 评论 -
LeetCode 94. 二叉树的中序遍历 - Go 实现
二叉树的中序遍历给定一个二叉树的根节点 root ,返回它的 中序 遍历。提示:树中节点数目在范围 [0, 100] 内-100 <= Node.val <= 100AC 代码/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */func inorderTr.原创 2021-03-02 15:58:48 · 179 阅读 · 0 评论 -
LeetCode 304. 二维区域和检索 - 矩阵不可变 - Go 实现
二维区域和检索 - 矩阵不可变给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2) 。Range Sum Query 2D上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。示例:给定 matrix = [[3, 0, 1, 4, 2],[5, 6, 3, 2, 1],[1, 2, 0, 1, 5],[4, 1, 0,.原创 2021-03-02 14:52:45 · 137 阅读 · 0 评论 -
LeetCode 6. Z 字形变换 - Go 实现
6. Z 字形变换将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:P A H NA P L S I I GY I R之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例 1:原创 2021-03-01 12:23:21 · 217 阅读 · 0 评论 -
LeetCode 66. 加一 Go 实现
66. 加一给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入:digits = [1,2,3]输出:[1,2,4]解释:输入数组表示数字 123。示例 2:输入:digits = [4,3,2,1]输出:[4,3,2,2]解释:输入数组表示数字 4321。示例 3:输入:digits = [0]输出:[1]AC 代码func原创 2021-03-01 10:10:15 · 170 阅读 · 0 评论 -
LeetCode 303. 区域和检索 - 数组不可变 - Go实现
给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。实现 NumArray 类:NumArray(int[] nums) 使用数组 nums 初始化对象int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点(也就是 sum(nums[i], nums[i + 1], ... , nums[j]))示例:输入:[“NumArray”, “sumRang原创 2021-03-01 09:48:35 · 103 阅读 · 0 评论 -
LeetCode 25. K 个一组翻转链表 - Go 实现
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。进阶:你可以设计一个只使用常数额外空间的算法来解决此问题吗?你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。示例 1:思路大致过程可以分解为1、找到待翻转的k个节点(注意:若剩余数量小于 k 的话,则不需要反转,因此直接返回待翻转部分的头结点即可)。2、对其进行翻转。并返回翻转后的头结点(注意:翻原创 2021-02-28 22:06:27 · 213 阅读 · 0 评论 -
LeetCode 剑指 Offer 47. 礼物的最大价值
剑指 Offer 47. 礼物的最大价值在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例 1:输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物解题思路:动态规划方程: dp[i][j] = grid[i][j]原创 2021-02-28 20:53:30 · 120 阅读 · 0 评论 -
LeetCode 459题解
重复的子字符串给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例 1:输入: “abab”输出: True解释: 可由子字符串 “ab” 重复两次构成。示例 2:输入: “aba”输出: False示例 3:输入: “abcabcabcabc”输出: True解释: 可由子字符串 “abc” 重复四次构成。 (或者子字符串 “abcabc” 重复两次构成。)设s=m+m , a= s+s = m+m+m.原创 2021-02-26 17:52:46 · 243 阅读 · 0 评论 -
LeetCode 剑指 Offer 29. 顺时针打印矩阵 - Go 实现
剑指 Offer 29. 顺时针打印矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]限制:0 <= matrix.length <= 1000 <= matrix[原创 2021-02-21 16:37:09 · 164 阅读 · 2 评论 -
LeetCode 485 . 最大连续1的个数
最大连续1的个数给定一个二进制数组, 计算其中最大连续 1 的个数。示例:输入:[1,1,0,1,1,1]输出:3解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.提示:输入的数组只包含 0 和 1 。输入数组的长度是正整数,且不超过 10,000。AC 代码func findMaxConsecutiveOnes(nums []int) int { var max float64 cnt := 0 for i := 0; i &l.原创 2021-02-15 23:51:20 · 180 阅读 · 0 评论 -
LeetCode 62. 不同路径 - Go 实现
不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?AC 代码func uniquePaths(m int, n int) int { dp := make([][]int , m) for i := 0; i < m; i++ { dp[i] = make([]int, n).原创 2021-02-14 23:24:19 · 325 阅读 · 0 评论 -
LeetCode 78. 子集- Go 实现
子集给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]AC 代码func subsets(nums []int) [][]int { l := list.New() result .原创 2021-02-14 22:53:28 · 302 阅读 · 0 评论 -
LeetCode 448. 找到所有数组中消失的数字
找到所有数组中消失的数字给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。示例:输入:[4,3,2,7,8,2,3,1]输出:[5,6]AC 代码func findDisappearedNumbers(nums []int) []int {.原创 2021-02-13 19:19:37 · 126 阅读 · 0 评论 -
LeetCode: 剑指 Offer 59 - II. 队列的最大值 - Go 实现
剑指 Offer 59 - II. 队列的最大值请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1示例 1:输入:[“MaxQueue”,“push_back”,“push_back”,“max_value”,“pop_front”,“max_value”][[],[1],[2],[],[],[]]输出: [原创 2021-02-12 20:39:31 · 163 阅读 · 0 评论 -
LeetCode 82. 删除排序链表中的重复元素 II
删除排序链表中的重复元素 II给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例 1:输入: 1->2->3->3->4->4->5输出: 1->2->5示例 2:输入: 1->1->1->2->3输出: 2->3/** * Definition for singly-linked list. * public class ListNode { * int .原创 2021-02-11 14:51:24 · 94 阅读 · 0 评论 -
LeetCode 剑指 Offer 31. 栈的压入、弹出序列- Go 实现
剑指 Offer 31. 栈的压入、弹出序列输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), pu原创 2021-02-11 10:37:58 · 146 阅读 · 0 评论 -
LeetCode 110.平衡二叉树
平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。AC 代码/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */func isBalanced(root *TreeNo.原创 2021-02-09 14:07:06 · 93 阅读 · 0 评论 -
leetCode 22. 括号生成 - Go 实现
括号生成数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]提示:1 <= n <= 8AC 代码func generateParenthesis(n int) []string { l := list.New() gen(n, 0, 0.原创 2021-02-08 16:23:37 · 201 阅读 · 1 评论 -
LeetCode 9. 回文数- Go实现
回文数给你一个整数 x ,如果 x 是一个回文整数,返回 ture ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例 1:输入:x = 121输出:true示例 2:输入:x = -121输出:false解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入:x = 10输出:false解释:从右向左读, 为 01 。因此它不是一个回文数。示.原创 2021-02-07 16:43:07 · 167 阅读 · 0 评论 -
LeetCode 287 寻找重复数 - Go 实现
寻找重复数给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。示例 1:输入:nums = [1,3,4,2,2]输出:2示例 2:输入:nums = [3,1,3,4,2]输出:3示例 3:输入:nums = [1,1]输出:1示例 4:输入:nums = [1,1,2]输出:1func findDuplicate(nums []in.原创 2021-02-06 16:54:16 · 127 阅读 · 0 评论 -
LeetCode 867 矩阵转换 - Go 实现
Golang刷LeetCode 867. 转置矩阵func transpose(A [][]int) [][]int { // 交换行和列索引 result:=make([][]int,len(A[0])) for i,_:=range result { result[i]=make([]int,len(A)) } for i:=0;i<len(A);i++ { for j:=0;j<len(A[0]);j++ {原创 2021-02-05 23:08:12 · 222 阅读 · 0 评论 -
LeetCode-141. 环形链表 -Go 实现
环形链表给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。/** * Definition for singly-linked list. * type .原创 2021-02-05 17:43:20 · 239 阅读 · 3 评论 -
链表反转 -- 剑指Offer C++ Class
链表反转 -- 剑指Offer C++ Class题目描述输入一个链表,反转链表后,输出链表的所有元素。不多说看代码:#includeusing namespace std;struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), n原创 2017-03-08 14:13:46 · 435 阅读 · 0 评论 -
LeetCode 42. 接雨水
接雨水给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例 2:输入:height = [4,2,0,3,2,5]输出:9提示:n == height.length0 <= n <= .原创 2021-01-14 20:28:35 · 114 阅读 · 0 评论 -
LeetCode56. 合并区间-二维数组排序问题
Arrays.sort(a, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {if (o1[0]==o2[0]) return o1[1]-o2[1];return o1[0]-o2[0];}});原创 2021-01-12 22:58:01 · 324 阅读 · 0 评论 -
LeetCode33. 搜索旋转排序数组
搜索旋转排序数组升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] )。请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。示例 1:输入:nums = [4,5,6,7,0,1,2], target = 0输出:4示例 2:输入:nums = [4,5,6,7,0,1,2], target = 3输出:-1示例 3:输入:nums = [1],原创 2021-01-10 21:36:15 · 161 阅读 · 0 评论 -
Leetcode_153. 寻找旋转排序数组中的最小值
寻找旋转排序数组中的最小值假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] 。请找出其中最小的元素。示例 1:输入:nums = [3,4,5,1,2]输出:1示例 2:输入:nums = [4,5,6,7,0,1,2]输出:0示例 3:输入:nums = [1]输出:1提示:1 <= nums.length <= 5000-5000 <= nums[i] <= .原创 2020-12-31 09:53:46 · 94 阅读 · 0 评论 -
LeetCode - 面试题 04.03. 特定深度节点链表
面试题 04.03. 特定深度节点链表给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。示例:输入:[1,2,3,4,5,null,7,8] 1 / \ 2 3 / \ \ 4 5 7/8输出:[[1],[2,3],[4,5,7],[8]]AC 代码:/** * Definition for a binary tree node. *原创 2020-11-29 10:35:32 · 284 阅读 · 0 评论 -
LeetCode-1497. 检查数组对是否可以被 k 整除
检查数组对是否可以被 k 整除给你一个整数数组 arr 和一个整数 k ,其中数组长度是偶数,值为 n 。现在需要把数组恰好分成 n / 2 对,以使每对数字的和都能够被 k 整除。如果存在这样的分法,请返回 True ;否则,返回 False 。示例 1:输入:arr = [1,2,3,4,5,10,6,7,8,9], k = 5输出:true解释:划分后的数字对为 (1,9),(2,8),(3,7),(4,6) 以及 (5,10) 。示例 2:输入:arr = [1,2,3,4,5.原创 2020-11-29 10:08:07 · 337 阅读 · 0 评论 -
LRU 算法实现
LRU 算法实现什么是 LRU 算法LRU是什么?按照英文的直接原义就是Least Recently Used,最近最久未使用法,它是按照一个非常著名的计算机操作系统基础理论得来的:最近使用的页面数据会在未来一段时期内仍然被使用,已经很久没有使用的页面很有可能在未来较长的一段时间内仍然不会被使用。基于这个思想,会存在一种缓存淘汰机制,每次从内存中找到最久未使用的数据然后置换出来,从而存入新的数据!它的主要衡量指标是使用的时间,附加指标是使用的次数。在计算机中大量使用了这个机制,它的合理性在于优先筛选热点原创 2020-11-16 10:11:38 · 373 阅读 · 0 评论 -
二分算法-LeetCode 69
二分算法-LeetCode 69二分算法二分算法模板, 二分搜索即搜索一个数,如果存在,返回其索引,否则返回-1。int binarySearch(int[] nums, int target) { int left = 0; int right = nums.length - 1; // 注意 while(left <= right) { // 注意 int mid = (right + left) / 2; if(nums[mid]原创 2020-11-08 18:09:40 · 290 阅读 · 0 评论 -
LeetCode343整数分解
题目链接:https://leetcode.com/problems/integer-break/description/思路动态规划的思想:dp[1] = 1 dp[2] = 1 dp[3]= 2 dp[4] = 4 dp[5]= 6 dp[6] = 9 dp[7] = 12 dp[8]= 18 dp[9] = 27动态规划方程:dp[1] = 1dp[i] = MAX(dp[i], MAX(dp[j](i-j),i(i-j))public class LeetCode343 {原创 2020-10-30 10:36:49 · 312 阅读 · 0 评论