LeetCode 23. 合并K个升序链表
23. 合并K个升序链表题目给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
12345678910输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[ 1->4->5, 1->3->4, 2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6
示例 2:
12输入:lists = []输出:[]
示例 3:
12输入:lists = [[]]输出:[]
提示:
k == lists.length0 <= k <= 10^40 <= lists[i].length <= 500-10^4 <= lists[i][j] <= 10^4lists[i] 按 升序 排列lists[i].length 的总和不超过 10^4
思路分治的思想,我们每次两个两个合并,然后在两个两个合并
实现12345678 ...
LeetCode 208. 实现 Trie (前缀树)
208. 实现 Trie (前缀树)题目Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
请你实现 Trie 类:
Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。
示例:
输入[“Trie”, “insert”, “search”, “search”, “startsWith”, “insert”, “search”][[], [“apple”], [“apple”], [“app”], [“app”], [“app”], [“app”]]输出[null, null, tr ...
LeetCode 3. 无重复字符的最长子串
3. 无重复字符的最长子串题目给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
123输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
123输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
1234输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
12输入: s = ""输出: 0
123提示:0 <= s.length <= 5 * 104s 由英文字母、数字、符号和空格组成
思路滑动窗口,使用一个map保存字符k,value为出现的位置,使用双指针,如果没有重复右指针一直向 ...
LeetCode 151. 翻转字符串里的单词
151. 翻转字符串里的单词题目给你一个字符串 s ,逐个翻转字符串中的所有 单词 。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
说明:
输入字符串 s 可以在前面、后面或者单词间包含多余的空格。翻转后单词间应当仅用一个空格分隔。翻转后的字符串中不应包含额外的空格。
示例 1:
输入:s = “the sky is blue”输出:”blue is sky the”示例 2:
输入:s = “ hello world “输出:”world hello”解释:输入字符串可以在前面或者后面包含多余的空格,但是翻转后的字符不能包括。示例 3:
输入:s = “a good example”输出:”example good a”解释:如果两个单词间有多余的空格,将翻转后单词间的空格减少到只含一个。示例 4:
输入:s = “ Bob Loves Alice “输出:”Alice Loves Bob”示例 5:
输入:s = “Alice does not even li ...
LeetCode 153. 寻找旋转排序数组中的最小值
153. 寻找旋转排序数组中的最小值题目已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。
给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。
示例 1:
123输入:nums = [3,4,5,1,2]输出:1解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。
示例 2:
123输入:nums = [4,5,6,7,0,1,2]输出:0解释:原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。
示例 3:
123输入:nums = [11,13,15,17 ...
LeetCode 189. 旋转数组
189. 旋转数组题目1234567891011121314151617181920212223242526272829303132给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 进阶:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗? 示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例 2:输入:nums = [-1,-100,3,99], k = 2输出:[3,99,-1,-100]解释: 向右旋转 1 步: [99,-1,-100,3]向右旋转 2 步: [3,99,-1,-100] 提示:1 <= nums.length <= 2 * 104-231 <= nums[i] <= 231 - 10 <= k <= 105
...
LeetCode 19 删除链表的倒数第 N 个结点
19 删除链表的倒数第 N 个结点题目给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:
输入:head = [1], n = 1输出:[]示例 3:
输入:head = [1,2], n = 1输出:[1]
提示:
链表中结点的数目为 sz1 <= sz <= 300 <= Node.val <= 1001 <= n <= sz
思路第一个思路就是,先遍历一遍,找到size,然后倒数k个节点就是size - k + 1,因为我们要移除这个节点,所以我们遍历到size-k的时候就可以,
时间负责度O(n)
第二个思路,我们快指针遍历k-1次,然后快慢指针同时遍历,当快指针遍历到末尾的时候,慢指针的指向的节点就是要移除的节点
实现遍历一遍找到size
需要考虑移除头节点的情况,这里我是用一个if判断,是否移除头节点
123456789101112131415161718192021222324252627private stat ...
LeetCode 2. 两数相加
2. 两数相加题目给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:
输入:l1 = [0], l2 = [0]输出:[0]示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内0 <= Node.val <= 9题目数据保证列表表示的数字不含前导零
思路我们可以使用一次遍历,使用一个int存储进位,第二个值需要加上上一个进位
实现1234567891011121314151617181920public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ...
LeetCode 20. 有效的括号
20. 有效的括号题目给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。
示例 1:
12输入:s = "()"输出:true
示例 2:
12输入:s = "()[]{}"输出:true
示例 3:
12输入:s = "(]"输出:false
示例 4:
12输入:s = "([)]"输出:false
示例 5:
12输入:s = "{[]}"输出:true
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
思路使用栈实现,进来一个元素和栈顶元素对比,如果能够匹配上则弹出栈顶元素,否则把这个元素压入栈
实现
LeetCode 199. 二叉树的右视图
199. 二叉树的右视图题目给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
12输入: [1,2,3,null,5,null,4]输出: [1,3,4]
示例 2:
12输入: [1,null,3]输出: [1,3]
示例 3:
12输入: []输出: []
提示:
二叉树的节点个数的范围是 [0,100]-100 <= Node.val <= 100
思路二叉树的层序遍历,每次遍历一层,遍历一层的时候我们那最后的节点
实现12345678910111213141516171819202122232425262728private static class Solution { public List<Integer> rightSideView(TreeNode root) { if (root == null) { return new ArrayList<>(); ...
LeetCode 160. 相交链表
160. 相交链表题目给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
自定义评测:
评测系统 的输入如下(你设计的程序 不适用 此输入):
intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0listA - 第一个链表listB - 第二个链表skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。
示例 1:
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3输 ...
LeetCode 118. 杨辉三角
118. 杨辉三角题目
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:
输入: numRows = 1输出: [[1]]
思路主要就是找规律,图片中的三角不容易看,可以自己画一下图,每行格子中的值第一个和最后一个为1,其余为正上方格子中的值+正上方格子中的值向左偏移的值相加
实现123456789101112131415161718192021222324252627282930313233343536373839public class YangHuiTriangle { public static void main(String[] args) { int num = 5; try { Scanner scanner = new Scanner(System.in) ...
LeetCode 121. 买卖股票的最佳时机
121. 买卖股票的最佳时机题目给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例 1:
1234输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
123输入:prices = [7,6,4,3,1]输出:0解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
提示:
1 <= prices.length <= 105
0 <= prices[i] <= 104
思路实现
LeetCode 142. 环形链表 II
142. 环形链表 II题目给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
示例 1:
输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中有一个环,其尾部连接到第二个节点。示例 2:
输入:head = [1,2], pos = 0输出:返回索引为 0 的链表节点解释:链表中有一个环,其尾部连接到第一个节点。示例 3:
输入:head = [1], pos = -1输出:返回 null解释:链表中没有环。
提示:
链表中节点的数目范围在范围 [0, 104] 内-105 <= Node.val <= 105pos 的值为 -1 或者链表中的一个有效索引
思路也是快门指针,相 ...
LeetCode 143. 重排链表
143. 重排链表题目给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]输出:[1,4,2,3]示例 2:
输入:head = [1,2,3,4,5]输出:[1,5,2,4,3]
提示:
链表的长度范围为 [1, 5 * 104]1 <= node.val <= 1000
思路
找到中间节点
翻转右边的链表
原左边的链表和右边的链表合并
这个题的主要难点:
拿到中间节点的时候,我们要考虑引用的链表在什么情况下会改变原来的值,当我们直接置空的时候不会改变原来饿值,但是我们next=null的时候会改变原来的值,所以我们可以直接返回中间节点的上一个节点
然后通过 mid.next = null;改变原来节点的值,划分出leftNode 和 rightNode
然后翻转链表,两个链表合并
...