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) { ...
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]
示例 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. 中序线索二叉树中求中序后继
中序遍历顺序:左子树 → 根 → 右子树。
求中序后继的逻辑(线索树的核心优势):
若当前节点有右线索(右指针是空指针改造的) → 直接指向后继;
若当前节点有右子树 → 后继是右子树中最左的节点(可通过右指针直接找到,无需遍历整树)。
逻辑规整,可有效求解
...
MG:邻接矩阵
ALG:邻接表
任务:一、图的创建与转换1.采用邻接矩阵表示法创建无向图(c)
通过文件输入:
1234567895 7ABCDEABADBCBECDCEDE
输出:
12345678Create adjacency matrix from the read fileprint adjacency matrix : A B C D EA 0 1 0 1 0B 1 0 1 0 1C 0 1 0 1 1D 1 0 1 0 1E 0 1 1 1 0
创建邻接矩阵代码
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091#include <iostream>#include <fs ...
17. 电话号码的字母组合——letter-combinations-of-a-phone-number给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
12输入:digits = "23"输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
12输入:digits = "2"输出:["a","b","c"]
提示:
1 <= digits.length <= 4
digits[i] 是范围 ['2', '9'] 的一个数字。
方法一:回溯首先使用哈希表存储每个数字对应的 ...


