leecode题目记录
leecode题目记录
1 两数之和
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
1 | 给定 nums = [2, 7, 11, 15], target = 9 |
java 遍历
1 | class Solution { |
go 遍历
1 | func twoSum(nums []int, target int) []int { |
2 两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
1 | 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) |
java 递归
1 | /** |
go 递归
1 | /** |
121 买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
1 | 输入: [7,1,5,3,6,4] |
java 暴力循环 或者 寻找历史最高值
1 | // 寻找历史最高值 |
go 求数组中最大和子集合
1 | func maxProfit(prices []int) int { |
206 反转链表
反转一个单链表。
java
1 | /** |
go
1 | /** |
322 零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
1 | 输入: coins = [1, 2, 5], amount = 11 |
java DFS(深度优先搜索)+去除多余的分支
1 | class Solution { |
go DFS(深度优先搜索)+去除多余的分支
1 | func coinChange(coins []int, amount int) int { |
409 最长回文串
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "Aa"
不能当做一个回文字符串。
1 | 输入: |
java 最大回文数
1 | class Solution { |
543 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。
1 | 给定二叉树 |
java 深度优先搜索
1 | /** |
go 深度优先搜索
1 | /** |
695 岛屿的最大面积
给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)
1 | [[0,0,1,0,0,0,0,1,0,0,0,0,0], |
java 沉岛算法
1 | // 沉岛算法 |
836 矩形重叠
矩形以列表 [x1, y1, x2, y2]
的形式表示,其中 (x1, y1)
为左下角的坐标,(x2, y2)
是右上角的坐标。
如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。
给出两个矩形,判断它们是否重叠并返回结果。
1 | 输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3] |
java 模拟
1 | class Solution { |
994 腐烂的橘子
在给定的网格中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。
1 | 输入:[[2,1,1],[1,1,0],[0,1,1]] |
java BFS(多维广度优先搜索)
1 | class Solution { |
go BFS
1 | func orangesRotting(grid [][]int) int { |
1013 将数组分成和相等的三个部分
给你一个整数数组 A
,只有可以将其划分为三个和相等的非空部分时才返回 true
,否则返回 false
。
1 | 输出:[0,2,1,-6,6,-7,9,1,2,0,1] |
java 直接寻找
1 | class Solution { |
1071 字符串的最大公因子
对于字符串 S 和 T,只有在 S = T + … + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。
1 | 输入:str1 = "ABCABC", str2 = "ABC" |
go 辗转相除法求出最大公约字符串
1 | # 辗转相除求最大公约数 |
Java 辗转相除 用index代替
1 | class Solution { |
1103 分糖果 II
排排坐,分糖果。
我们买了一些糖果 candies,打算把它们分给排好队的 n = num_people 个小朋友。
给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小朋友 n 颗糖果。
然后,我们再回到队伍的起点,给第一个小朋友 n + 1 颗糖果,第二个小朋友 n + 2 颗,依此类推,直到给最后一个小朋友 2 * n 颗糖果。
重复上述过程(每次都比上一次多给出一颗糖果,当到达队伍终点后再次从队伍起点开始),直到我们分完所有的糖果。注意,就算我们手中的剩下糖果数不够(不比前一次发出的糖果多),这些糖果也会全部发给当前的小朋友。
返回一个长度为 num_people、元素之和为 candies 的数组,以表示糖果的最终分发情况(即 ans[i] 表示第 i 个小朋友分到的糖果数)
1 | 输入:candies = 7, num_people = 4 |
java 模拟
1 | class Solution { |
go 模拟
1 | func distributeCandies(candies int, num_people int) []int { |
1160 拼写单词
给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。
假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。
注意:每次拼写时,chars 中的每个字母都只能用一次。
返回词汇表 words 中你掌握的所有单词的 长度之和。
1 | 输入:words = ["cat","bt","hat","tree"], chars = "atach" |
java 统计字符对比
1 | class Solution { |
10.01 合并排序的数组
给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。
初始化 A 和 B 的元素数量分别为 m 和 n。
1 | 输入: |
java
1 | class Solution { |
01.06 字符串压缩
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
1 | 输入:"aabcccccaaa" |
java 程序模拟
1 | class Solution { |
05 替换空格
请实现一个函数,把字符串 s
中的每个空格替换成”%20”。
1 | 输入:s = "We are happy." |
java
1 | class Solution { |
go
1 | func replaceSpace(s string) string { |
57 - II 和为s的连续正数序列
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
1 | 输入:target = 9 |
java 滑动窗口
1 | class Solution { |
go 滑动窗口
1 | func findContinuousSequence(target int) [][]int { |
59 - II. 队列的最大值
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
1 | 输入: |
java
1 | class MaxQueue { |
go
1 | type MaxQueue struct { |