1143. 最长公共子序列(常规)
1143. 最长公共子序列(常规)给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
例如,”ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
示例 1:123输入:text1 = "abcde", text2 = "ace" 输出:3 解释:最长公共子序列是 "ace" ,它的长度为 3 。
示例 2:123输入:text1 = "abc", text2 = "abc"输出:3解释:最长公共子序列是 "abc" ,它的长度为 3 。
示例 3:123输入:text1 = "abc&qu ...
215. 数组中的第K个最大元素(简单)
215. 数组中的第K个最大元素(简单)在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5
示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4
说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
思路1:堆,使用优先队列
思路2:快排中partition,k-1个比其大,就可以了
代码:123456789101112131415161718192021class Solution { public int findKthLargest(int[] nums, int k) { int len = nums.length; //堆,使用优先队列,求k大值用最小堆,默认就是最小堆 ...
148. 排序链表(一般)
148. 排序链表(一般)给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
进阶:
你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
示例 1:12输入:head = [4,2,1,3]输出:[1,2,3,4]
示例 2:12输入:head = [-1,5,3,4,0]输出:[-1,0,3,4,5]
示例 3:12输入:head = []输出:[]
提示:
链表中节点的数目在范围 [0, 5 * 104] 内-105 <= Node.val <= 105
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sort-list
思路
先找中间节点,断开
递归下探
合并有序链表
代码1:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656 ...
18. 四数之和(一般)
18. 四数之和(一般)给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:答案中不可以包含重复的四元组。
示例 1:输入:nums = [1,0,-1,0,-2,2], target = 0输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]示例 2:
输入:nums = [], target = 0输出:[]
提示:0 <= nums.length <= 200-109 <= nums[i] <= 109-109 <= target <= 109
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/4sum
思路:类比三数之和的算法
代码:123456789101112131415161718192021222324252627282930313233343536373839404142434 ...
83. 删除排序链表中的重复元素(简单)
83. 删除排序链表中的重复元素(简单)存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
示例 1:输入:head = [1,1,2]输出:[1,2]
示例 2:输入:head = [1,1,2,3,3]输出:[1,2,3]
提示:链表中节点数目在范围 [0, 300] 内-100 <= Node.val <= 100题目数据保证链表已经按升序排列
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list
思路:一次遍历,常规
代码:1234567891011121314151617class Solution { public ListNode deleteDuplicates(ListNode head) { if (head == null) { return head; & ...
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:123456输入:lists = []输出:[]示例 3:输入:lists = [[]]输出:[]
提示:123456k == lists.length0 <= k <= 10^40 <= lists[i].length <= 500-10^4 <= lists[i][j] <= 10^4lists[i] 按 升序 排列lists[i]. ...
461. 汉明距离(简单)
461. 汉明距离(简单)两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:0 ≤ x, y < 231.
示例:12345678910输入: x = 1, y = 4输出: 2解释:1 (0 0 0 1)4 (0 1 0 0) ↑ ↑上面的箭头指出了对应二进制位不同的位置。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/hamming-distance
思路:位运算,只需要计算x和y的异或结果,然后再计算这个结果的二进制中1的个数
代码:12345678910111213141516171819202122232425class Solution { public int hammingDistance(int x, int y) { //位运算,只需要计算x和y的异或结果,然后再计算这个结果的二进制中1的个数 int z = x^y; ...
92. 反转链表 II(较难)
92. 反转链表 II(较难)给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]
示例 2:输入:head = [5], left = 1, right = 1输出:[5]
提示:链表中节点数目为 n1 <= n <= 500-500 <= Node.val <= 5001 <= left <= right <= n
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
思路:需要有个哨兵,用来指向头节点,这样不需要进行越界判断
步骤如下:
设置哨兵,指向头节点
设置pre指向反转链表的前一个节点
设置cur指向pre的next节点
从left遍历到right
在循环里面定义next指 ...
200. 岛屿数量(一般)
200. 岛屿数量(一般)给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:1234567输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"]]输出:1
示例 2:1234567输入:grid = [ ["1"," ...
145. 二叉树的后序遍历(简单)
145. 二叉树的后序遍历(简单)给定一个二叉树,返回它的 后序 遍历。
示例:12345678输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal
思路1:递归
思路2:迭代
代码1:123456789101112class Solution { List<Integer> res = new ArrayList<>(); public List<Integer> postorderTraversal(TreeNode root) { if(root==null){ return new ArrayList<>(); } postorde ...