LeetCode
LeetCode
@曾是书生
这个作者很懒,什么都没留下…
展开
-
剑指offer (每日抄题计划)
剑指offer (每日抄题计划)原创 2022-07-31 23:01:42 · 129 阅读 · 1 评论 -
50(牛客Top100)-141.环形链表
给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。思路:双指针方法1:快慢指针 public boolean hasCycle(L原创 2021-12-02 21:50:38 · 296 阅读 · 0 评论 -
48(牛客Top100)-136.只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?思路:方法1:利用与操作public int singleNumber(int[] nums) { int single = 0; for(int i = 0; i < nums.length; i++) { single ^= nums[i]; }原创 2021-12-02 21:38:21 · 307 阅读 · 0 评论 -
47(牛客Top100)-128.最长连续子序列
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。思路:方法1: 利用set集合 public int longestConsecutive(int[] nums) { HashSet<Integer> set = new HashSet<>(); //1.利用set去重 for (int i = 0; i <原创 2021-12-02 21:31:15 · 75 阅读 · 0 评论 -
45(牛客Top100)-121.买卖股票的最优时间
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。思路:方法1:一次遍历 public int maxProfit(int[] prices) { //1.记录最小价格 int minprice = Inte原创 2021-12-01 20:44:41 · 181 阅读 · 0 评论 -
42(牛客Top100)-102.二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。思路:用队列按层次遍历方法1:广度优先搜索 public List<List<Integer>> levelOrder(TreeNode root) { //1.用集合存储结果 List<List<Integer>> res = new ArrayList<List<Integer>>();原创 2021-11-29 20:51:52 · 72 阅读 · 0 评论 -
41(牛客Top100)-104.二叉树的最大深度
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。思路:方法1:深度优先搜索public int maxDepth(TreeNode root) { if (root == null) return 0; else { int leftHeight = maxDepth(root.left); int rightHeight = maxDept原创 2021-11-29 20:11:29 · 63 阅读 · 0 评论 -
39(牛客Top100)-98.验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。思路:方法1:递归 public boolean isValidBST(TreeNode root) { return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } public bo原创 2021-11-28 21:13:17 · 74 阅读 · 0 评论 -
40(牛客Top100)-101.对称二叉树
给定一个二叉树,检查它是否是镜像对称的。思路:方法1:递归 public boolean isSymmetric(TreeNode root) { return checkTree(root, root); } public boolean checkTree(TreeNode p, TreeNode q) { if (p == null && q == null) return true; if (p == nul原创 2021-11-28 20:10:50 · 44 阅读 · 0 评论 -
38(牛客Top100)-96.不同的二叉搜索树
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。思路:1.动态规划动态方程: public int numTrees(int n) { int[] dp = new int[n + 1]; dp[0] = 1; dp[1] = 1; for (int i = 2; i <= n; i++) { for (int j =原创 2021-11-28 19:41:56 · 219 阅读 · 0 评论 -
37(牛客Top100)-94.二叉树的中序遍历
给定一个二叉树的根节点 root ,返回它的 中序 遍历。思路:方法1:递归按照访问左子树——根节点——右子树的方式遍历这棵树 public List<Integer> inorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); inorder(root, res); return res; } public原创 2021-11-28 18:32:59 · 241 阅读 · 0 评论 -
36(牛客Top100)-85.最大矩阵
给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。思路:先抄下来,我也不懂方法1:单调栈public int maximalRectangle(char[][] matrix) { int m = matrix.length; if (m == 0) { return 0; } int n = matrix[0].length;原创 2021-11-24 23:03:20 · 102 阅读 · 0 评论 -
35(牛客Top100)-84.柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。思路:方法1:栈 + 邵兵 public int largestRectangleArea(int[] heights) { int len = heights.length; if (len == 0) return 0; if (len == 1) return heights[0]; int原创 2021-11-24 22:48:59 · 79 阅读 · 0 评论 -
34(牛客Top100)-79.单词搜索
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。思路:方法1:回溯public static boolean exist(char[][] board, String word) { int m = board.length, n = boa原创 2021-11-23 23:28:38 · 80 阅读 · 0 评论 -
33(牛客Top100)-78.子集
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。思路方法1:二进制排序(字典排序) public List<List<Integer>> subsets(int[] nums) { //1.新建一个集合存储结果 List<List<Integer>> result = new ArrayList<>();原创 2021-11-23 21:15:00 · 77 阅读 · 0 评论 -
31(牛客Top100)-75.颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。思路:双指针: public static void sortColors(int[] nums) { int n = nums.length; if (n < 2) return; //p0指向0最后一个元素的下一个元素,p1指向为2的前一个元素原创 2021-11-22 22:48:33 · 198 阅读 · 0 评论 -
22(牛客Top100)-48.旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。思路:方法1:原地旋转 public void rotate(int[][] matrix){ int n = matrix.length; for (int i = 0; i < n/2; i++) { for (int j = 0; j &原创 2021-11-21 19:59:52 · 1205 阅读 · 0 评论 -
29(牛客Top100)-70.爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。思路:方法1:动态规划public int climbStatic(int n) { //防止数组越界 if (n == 1 || n == 0) { return n; } //1.初始化数组 int[] dp = new int[n];原创 2021-11-21 16:47:05 · 258 阅读 · 0 评论