48. 旋转图像——rotate-image给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在** 原地** 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
12输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]
示例 2:
12输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
提示:
n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000
📄 方法一:使用辅助数组 (Method One: Using an Auxiliary Array)我们以题目中的示例二
$$\begin{bmatr ...
一、单选1.握手定理无向图G有23条边,度为4的顶点有5个,度为3的顶点有4个,其余都是度2的顶点,则图G最多有( )个顶点。
关键依据:握手定理==无向图中所有顶点的度数之和等于边数的 2 倍。==
已知边数为 23,因此总度数之和为 23×2=46。
计算过程
先算已知度数的顶点贡献的总度数:度为 4 的 5 个顶点总度数为 4×5=20,度为 3 的 4 个顶点总度数为 3×4=12,两者相加共 32。
剩余总度数为 46-32=14,由度为 2 的顶点承担。
度为 2 的顶点数量为 14÷2=7。
总顶点数为 5(度 4)+4(度 3)+7(度 2)=16。
4.邻接表 边表结点若邻接表中有奇数个边表结点,则一定是( )。
A.图中有奇数个结点
B.图中有偶数个结点
C.图为无向图
D.图为有向图
边表结点的定义在图的邻接表存储结构中,每个顶点会对应一个链表(称为边表),链表中的每个结点就是边表结点。所以是D
5.迪杰斯特拉对如下有向带权图,若采用迪杰斯特 ...
46. 全排列——permutations给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
12输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
12输入:nums = [0,1]输出:[[0,1],[1,0]]
示例 3:
12输入:nums = [1]输出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数 互不相同
我的正确答案:DFS + 回溯
一遍过(就是复杂度高了点):
时间:击败15.48%
空间:击败29.46%
12345678910111213141516171819202122232425class Solution { public List<List<Integer>> permute(int[] nums) { Li ...
39. 组合总和——combination-sum给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
示例 1:
123456输入:candidates = [2,3,6,7], target = 7输出:[[2,2,3],[7]]解释:2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。7 也是一个候选, 7 = 7 。仅有这两种组合。
示例 2:
12输入: candidates = [2,3,5], target = 8输出: [[2,2,2,2],[2,3,3],[3,5]]
示例 3:
12输入: candidates = [2], target = 1输出: []
提示: ...
算法题解
未读34. 在排序数组中查找元素的第一个和最后一个位置——find-first-and-last-position-of-element-in-sorted-array给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
示例 1:
12输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]
示例 2:
12输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]
示例 3:
12输入:nums = [], target = 0输出:[-1,-1]
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109
我的正确答案:
还是有点巧妙的,先找到一个target ...
33. 搜索旋转排序数组——search-in-rotated-sorted-array整数数组 nums 按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 向左旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 下标 3 上向左旋转后可能变为 [4,5,6,7,0,1,2] 。
给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
示例 1:
12输入:nums = [4,5,6,7,0,1,2], target = 0输出:4
示例 2:
12输入:nums = [4,5,6,7,0,1,2], target = 3输出:-1
示例 3:
12输 ...
31. 下一个排列——next-permutation整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。
例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。
整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。
给你一个整数数组 nums ,找出 nums 的下一个排列。
必须** 原地 **修改,只允许使用额外常数空间。
示例 1:
12输入:nums = [1,2,3]输出:[1,3,2]
...
22. 括号生成——generate-parentheses数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
12输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
12输入:n = 1输出:["()"]
提示:
1 <= n <= 8
答案:回溯算法 + 约束剪枝1234567891011121314151617181920class Solution { List<String> res = new ArrayList<>(); public List<String> generateParenthesis(int n) { dfs("", n, n); return res; } ...
19. 删除链表的倒数第 N 个结点——remove-nth-node-from-end-of-list给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
12输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]
示例 2:
12输入:head = [1], n = 1输出:[]
示例 3:
12输入:head = [1,2], n = 1输出:[1]
提示:
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
我的错误代码1234567891011121314151617181920212223242526272829303132package com.example.leetcode;public class removeNthEndOfTheList { public class ListNode { int val; ListNode next; ...
选择题55.先序序列为abcd的二叉树共有( )棵。
A.13
B.14
C.15
D.16
记公式:Cₙ = (1/(n+1)) × C(2n, n)
跟出栈序列一个公式
99.二叉树在线索化后,仍不能有效求解的问题是( )。
A.先序线索二叉树中求先序后继
B.中序线索二叉树中求中序后继
C.中序线索二叉树中求中序前驱
D.后序线索二叉树中求后序后继
A. 先序线索二叉树中求先序后继
先序遍历顺序:根 → 左子树 → 右子树。
求先序后继的逻辑(直接通过当前节点指针 / 线索找到):
若当前节点有左子树 → 后继是左子树的根(直接用左指针);
若当前节点无左子树 → 后继是右子树的根(直接用右指针,若右空则是线索指向的后继)。
无需遍历其他节点,可有效求解
B. 中序线索二叉树中求中序后继
中序遍历顺序:左子树 → 根 → 右子树。
求中序后继的逻辑(线索树的核心优势):
若当前节点有右线索(右指针是空指针改造的) → 直接指向后继;
若当前节点有右子树 → 后继是右子树中最左的节点(可通过右指针直接找到,无需遍历整 ...


