54. 螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
**输入:**matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
**输入:**matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
维护四个边界,每次到达边界则转换方向再收缩即可
123456789101112131415161718192021222324252627282930class Solution {public: vector<int> spiralOrder(vector<vector<int>> &matrix) { ...
53. 最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。
示例 1:
**输入:**nums = [-2,1,-3,4,-1,2,1,-5,4]
**输出:**6
**解释:**连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
**输入:**nums = [1]
**输出:**1
示例 3:
**输入:**nums = [5,4,-1,7,8]
**输出:**23
提示:
1 <= nums.length <= 10(5)
-10(4) <= nums[i] <= 10(4)
**进阶:**如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。
动态规划,dp[i]表示以第i个元素结尾的子数组的最大和
则dp[i+1] = max(nums[i], dp[i]+nums[i])
12345678910111213class Solution {public: int maxSubArray(vector<int> ...
51. N 皇后
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例 1:
**输入:**n = 4
输出:[[".Q…","…Q",“Q…”,"…Q."],["…Q.",“Q…”,"…Q",".Q…"]]
**解释:**如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
**输入:**n = 1
输出:[[“Q”]]
提示:
1 <= n <= 9
根据题目易得每行每列只能放一个棋子
所以我们可以对每行选定一列后,再看下一行的哪一列能放棋子
此时已经确保了每行一个棋子,我们还需要记录已经有哪些列放置了棋子,在遍历列时剔除
对于斜线,关键是
左上到右下斜线,此时row ...
49. 字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
解释:
在 strs 中没有字符串可以通过重新排列来形成 “bat”。
字符串 “nat” 和 “tan” 是字母异位词,因为它们可以重新排列以形成彼此。
字符串 “ate” ,“eat” 和 “tea” 是字母异位词,因为它们可以重新排列以形成彼此。
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = [“a”]
输出: [[“a”]]
提示:
1 <= strs.length <= 10(4)
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母
设计哈希函数使得字母异位词的哈希值相等
既然字母异位词只是字母顺序不一样,则可以先排序,这样得到的字符 ...
48. 旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
**输入:**matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
示例 2:
**输入:**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
与螺旋矩阵类似,我们在旋转时可以按层进行旋转
先把顶层放到右边,再把底层放到左边,最后上下层倒着交换
因为边界问题,注意每行/列的最后一个元素应归为下一个边界
1234567891011121314151 ...
46. 全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
**输入:**nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
**输入:**nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:
**输入:**nums = [1]
输出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数 互不相同
回溯法,每次选择一个数填入,可以使用标记数组来记录已经填入的数
12345678910111213141516171819202122232425class Solution {public: unordered_map<int, bool> vis; vector<vector<int>> ans; vector<vector<int>> p ...







