# algorithm-primer **Repository Path**: xujian01/algorithm-primer ## Basic Information - **Project Name**: algorithm-primer - **Description**: algorithm primer - 算法基础、Leetcode 编程和剑指offer,Java实现 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-02-11 - **Last Updated**: 2022-02-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # algorithm-primer > > algorithm primer - 算法基础、Leetcode编程、剑指offer > # 目录 - [算法基础](#summary/algorithm-summary.md) - [Leetcode编程](#Leetcode编程) * [**Leetcode编程源码**](leetcode/src/main/java/leetcode) * [Top 100 Liked Questions](#Top-100-Liked-Questions) * [Leetcode all questions](#All-Questions) * [Leetcode Summary](summary/leetcode-summary.md) * [Leetcode Category](#Leetcode-Category) * [数组与矩阵](#数组与矩阵) * [链表](#链表) * [栈与队列](#栈与队列) * [字符串](#字符串) * [哈希表](#哈希表) * [树](#树) * [二叉树](#二叉树) * [二叉搜索树](#二叉搜索树) * [字典树](#字典树) * [图](#图) * [位运算](#位运算) * [排序](#排序) * [排序应用](#排序应用) * [拓扑排序](#拓扑排序) * [二分查找](#二分查找) * [双指针](#双指针) * [贪心](#贪心) * [分治](#分治) * [搜索](#搜索) * [BFS](#BFS) * [DFS](#DFS) * [回溯](#回溯) * [递归与动态规划](#递归与动态规划) - [剑指offer](#剑指offer) * [**剑指offerV2源码**](interview-for-offer/src/main/java/offerV2) * [剑指offer V2](#剑指offer-V2) * [剑指offer V1](#剑指offer-V1) * [剑指offer Summary](summary/interviewforoffer-summary.md) * [剑指offer V2分类](#剑指offer-V2分类) * [数组](#剑指offer-数组与哈希表) * [链表](#剑指offer-链表) * [二叉树](#剑指offer-二叉树) * [栈与队列](#剑指offer-栈与队列) * [字符串](#剑指offer-字符串) * [位运算](#剑指offer-位运算) * [递归与动态规划](#剑指offer-递归与动态规划) - [参考](#参考) --- # Leetcode编程 ## Leetcode Category ### 栈与队列 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 20 | 有效的括号 Valid Parentheses | [Java](leetcode/src/main/java/leetcode/_0020_ValidParentheses.java) | Easy | | | 94 | 二叉树的中序遍历 Binary Tree Inorder | [Java](leetcode/src/main/java/leetcode/_0094_BinaryTreeInorderTraversal.java) | Medium | | | 155 | 最小栈 Min Stack | [Java](leetcode/src/main/java/leetcode/_0155_MinStack.java) | Easy | | | 394 | 字符串编码 Decode String | [Java](leetcode/src/main/java/leetcode/_0394_DecodeString.java) | Medium | | ### 链表 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 2 | 两数相加 Add Two Numbers | [Java](leetcode/src/main/java/leetcode/_0002_AddTwoNumbers.java) | Medium | | | 19 | 删除链表倒数第N个节点 Remove Nth Node From End of List | [Java](leetcode/src/main/java/leetcode/_0019_RemoveNthNodeFromEndOfList.java) | Medium | | | 21 | 合并两个有序链表 Merge Two Sorted Lists | [Java](leetcode/src/main/java/leetcode/_0021_MergeTwoSortedLists.java) | Easy | | | 141 | 判断链表是是否存在环 Linked List Cycle | [Java](leetcode/src/main/java/leetcode/_0141_LinkedListCycle.java) | Easy | | | 142 | 环形链表II Linked List Cycle II | [Java](leetcode/src/main/java/leetcode/_0142_LinkedListCycleII.java) | Medium | | | 148 | 排序链表 Sort List | [Java](leetcode/src/main/java/leetcode/_0148_SortList.java) | Medium | | | 160 | 相交链表 Intersection of Two Linked Lists | [Java](leetcode/src/main/java/leetcode/_0160_IntersectionOfTwoLinkedLists.java) | Easy | | | 206 | 反转链表 Reverse Linked List | [Java](leetcode/src/main/java/leetcode/_0206_ReverseLinkedList.java) | Easy | | | 234 | 回文链表 Palindrome Linked List | [Java](leetcode/src/main/java/leetcode/_0234_PalindromeLinkedList.java) | Easy | | ### 数组与矩阵 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 105 | Construct Binary Tree from Preorder and Inorder Traversal | [Java](leetcode/src/main/java/leetcode/_0105_ConstructBinaryTreeFromPreorderAndInorderTraversal.java) | Medium | | | 121 | Best Time to Buy and Sell Stock | [Java](leetcode/src/main/java/leetcode/_0121_BestTimeToBuyAndSellSock.java) | Easy | | | 152 | Maximum Product Subarray | [Java](leetcode/src/main/java/leetcode/_0152_MaximumProductSubarray.java) | Medium | | | 169 | Majority Element | [Java](leetcode/src/main/java/leetcode/_0169_MajorityElement.java) | Easy | | | 238 | Product of Array Except Self | [Java](leetcode/src/main/java/leetcode/_0238_ProductOfArrayExceptSelf.java) | Medium | | | 283 | Move Zeroes | [Java](leetcode/src/main/java/leetcode/_0283_MoveZeroes.java) | Easy | | | 287 | Find the Duplicate Number | [Java](leetcode/src/main/java/leetcode/_0287_FindTheDuplicateNumber.java) | Medium | | | 448 | Find All Numbers Disappeared in an Array | [Java](leetcode/src/main/java/leetcode/_0448_FindAllNumbersDisappearedInAnArray.java) | Easy | | | 560 | Subarray Sum Equals K | [Java](leetcode/src/main/java/leetcode/_0560_SubarraySumEqualsK.java) | Medium | | | 581 | Shortest Unsorted Continuous Subarray | [Java](leetcode/src/main/java/leetcode/_581_ShortestUnsortedContinuousSubarray.java) | Easy | | ### 树 #### 二叉树 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 94 | 二叉树的中序遍历 Binary Tree Inorder | [Java](leetcode/src/main/java/leetcode/_0094_BinaryTreeInorderTraversal.java) | Medium | | | 101 | 对称二叉树 Symmetric Tree | [Java](leetcode/src/main/java/leetcode/_0101_SymmetricTree.java) | Easy | | | 102 | 二叉树的层次遍历 Binary Tree Level Order Traversal | [Java](leetcode/src/main/java/leetcode/_0102_BinaryTreeLevelOrderTraversal.java) | Medium | | | 104 | 二叉树的最大深度 Maximum Depth of Binary Tree | [Java](leetcode/src/main/java/leetcode/_0104_MaximumDepthOfBinaryTree.java) | Easy | | | 105 | 从前序与中序遍历序列构造二叉树 Construct Binary Tree from Preorder and Inorder Traversal | [Java](leetcode/src/main/java/leetcode/_0105_ConstructBinaryTreeFromPreorderAndInorderTraversal.java) | Medium | | | 114 | 二叉树展开为链表 Flatten Binary Tree to Linked List | [Java](leetcode/src/main/java/leetcode/_0114_FlattenBinaryTreeToLinkedList.java) | Medium | | | 124 | 二叉树中的最大路径和 Binary Tree Maximum Path Sum | [Java](leetcode/src/main/java/leetcode/_0124_BinaryTreeMaximumPathSum.java) | Hard | | | 226 | 翻转二叉树 Invert Binary Tree | [Java](leetcode/src/main/java/leetcode/_0226_InvertBinaryTree.java) | Easy | | | 236 | 二叉树的最近公共祖先 Lowest Common Ancestor of a Binary Tree | [Java](leetcode/src/main/java/leetcode/_0236_LowestCommonAncestorOfABinaryTree.java) | Medium | | | 257 | 二叉树路径 Binary Tree Paths | [Java](leetcode/src/main/java/leetcode/_0257_BinaryTreePaths.java) | Easy | | | 337 | 打家劫舍 III House Robber III | [Java](leetcode/src/main/java/leetcode/_0337_HouseRobberIII.java) | Medium | | | 437 | 路径总和 III Path Sum III | [Java](leetcode/src/main/java/leetcode/_0437_PathSumIII.java) | Easy | | | 543 | 二叉树的直径 Diameter of Binary Tree | [Java](leetcode/src/main/java/leetcode/_0543_DiameterOfBinaryTree.java) | Easy | | | 617 | 合并二叉树 Merge Two Binary Trees | [Java](leetcode/src/main/java/leetcode/_0617_MergeTwoBinaryTrees.java) | Easy | | #### 二叉搜索树 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 96 | 不同的二叉搜索树 Unique Binary Search Trees | [Java](leetcode/src/main/java/leetcode/_0096_UniqueBinarySearchTrees.java) | Medium | | | 98 | 验证二叉搜索树 Validate Binary Search Tree | [Java](leetcode/src/main/java/leetcode/_0098_ValidateBinarySearchTree.java) | Medium | | | 538 | 把二叉搜索树转换为累加树 Convert BST to Greater Tree | [Java](leetcode/src/main/java/leetcode/_0538_ConvertBSTToGreaterTree.java) | Easy | | #### 字典树 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 208 | 实现 Trie (前缀树) Implement Trie (Prefix Tree) | [Java](leetcode/src/main/java/leetcode/_0208_ImplementTrie.java) | Medium | | ### 哈希表 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 1 | 两数之和 Two Sum | [Java](leetcode/src/main/java/leetcode/_0001_TwoSum.java) | Easy | | | 3 | 无重复字符的最长子串 Longest Substring Without Repeating Characters | [Java](leetcode/src/main/java/leetcode/_0003_LongestSubstringWithoutRepeatingCharacters.java) | Medium | | | 49 | 字母异位词分组 Group Anagrams | [Java](leetcode/src/main/java/leetcode/_0049_GroupAnagrams.java) | Medium | | | 94 | 二叉树的中序遍历 Binary Tree Inorder | [Java](leetcode/src/main/java/leetcode/_0094_BinaryTreeInorderTraversal.java) | Medium | | | 136 | 只出现一次的数字 Single Number | [Java](leetcode/src/main/java/leetcode/_0136_SingleNumber.java) | Easy | | | 347 | 前 K 个高频元素 Top K Frequent Elements | [Java](leetcode/src/main/java/leetcode/_0347_TopKFrequentElements.java) | Medium | | | 438 | 找到字符串中所有字母异位词 Find All Anagrams in a String | [Java](leetcode/src/main/java/leetcode/_0438_FindAllAnagramsInAString.java) | Medium | | | 560 | 和为K的子数组 Subarray Sum Equals K | [Java](leetcode/src/main/java/leetcode/_0560_SubarraySumEqualsK.java) | Medium | | ### 字符串 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 3 | 无重复字符的最长子串 Longest Substring Without Repeating Characters | [Java](leetcode/src/main/java/leetcode/_0003_LongestSubstringWithoutRepeatingCharacters.java) | Medium | | | 5 | 最长回文子串 Longest Palindromic Substring | [Java](leetcode/src/main/java/leetcode/_0005_LongestPalindromicSubstring.java) | Medium | | | 17 | 电话号码的字母组合 Letter Combinations of a Phone Number | [Java](leetcode/src/main/java/leetcode/_0017_LetterCombinationsOfAPhoneNumber.java) | Medium | | | 20 | 有效的括号 Valid Parentheses | [Java](leetcode/src/main/java/leetcode/_0020_ValidParentheses.java) | Easy | | | 22 | 括号生成 Generate Parentheses | [Java](leetcode/src/main/java/leetcode/_0022_GenerateParentheses.java) | Medium | | | 49 | 字母异位词分组 Group Anagrams | [Java](leetcode/src/main/java/leetcode/_0049_GroupAnagrams.java) | Medium | | | 647 | 回文子串 Palindromic Substrings | [Java](leetcode/src/main/java/leetcode/_0647_PalindromicSubstrings.java) | Medium | | ### 堆 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 215 | 数组中的第K个最大元素 Kth Largest Element in an Array | [Java](leetcode/src/main/java/leetcode/_0215_KthLargestElementInAnArray.java) | Medium | | | 347 | 前 K 个高频元素 Top K Frequent Elements | [Java](leetcode/src/main/java/leetcode/_0347_TopKFrequentElements.java) | Medium | | --- ### 排序 #### 排序应用 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 56 | 合并区间 Merge Intervals | [Java](leetcode/src/main/java/leetcode/_0056_MergeIntervals.java) | Medium | | | 75 | 颜色分类 Sort Colors | [Java](leetcode/src/main/java/leetcode/_0075_SortColors.java) | Medium | | | 148 | 排序链表 Sort List | [Java](leetcode/src/main/java/leetcode/_0148_SortList.java) | Medium | | #### 拓扑排序 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 207 | 课程表 Course Schedule | [Java](leetcode/src/main/java/leetcode/_0207_CourseSchedule.java) | Medium | | --- ### 二分查找 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 34 | 在排序数组中查找元素的第一个和最后一个位置 Find First and Last Position of Element in Sorted Array | [Java](leetcode/src/main/java/leetcode/_0034_FirstAndLastPositionOfElementInSortedArray.java) | Medium | | | 240 | 搜索二维矩阵 II Search a 2D Matrix II | [Java](leetcode/src/main/java/leetcode/_0240_SearchA2DMatrixII.java) | Medium | | | 287 | 寻找重复数 Find the Duplicate Number | [Java](leetcode/src/main/java/leetcode/_0287_FindTheDuplicateNumber.java) | Medium | | | 300 | 最长上升子序列 Longest Increasing Subsequence | [Java](leetcode/src/main/java/leetcode/_0300_LongestIncreasingSubsequence.java) | Medium | | ### 双指针 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 3 | 无重复字符的最长子串 Longest Substring Without Repeating Characters | [Java](leetcode/src/main/java/leetcode/_0003_LongestSubstringWithoutRepeatingCharacters.java) | Medium | | | 11 | 盛最多水的容器 Container With Most Water | [Java](leetcode/src/main/java/leetcode/_0011_ContainerWithMostWater.java) | Medium | | | 15 | 三数之和 3Sum | [Java](leetcode/src/main/java/leetcode/_0015_3Sum.java) | Medium | | | 16 | 最接近的三数之和 3Sum Closest | [Java](leetcode/src/main/java/leetcode/_0016_3SumClosest.java) | Medium | | | 19 | 删除链表的倒数第N个节点 Remove Nth Node From End of List | [Java](leetcode/src/main/java/leetcode/_0019_RemoveNthNodeFromEndOfList.java) | Medium | | | 75 | 颜色分类 Sort Colors | [Java](leetcode/src/main/java/leetcode/_0075_SortColors.java) | Medium | | | 141 | 环形链表 Linked List Cycle | [Java](leetcode/src/main/java/leetcode/_0141_LinkedListCycle.java) | Easy | | | 142 | 环形链表 II Linked List Cycle II | [Java](leetcode/src/main/java/leetcode/_0142_LinkedListCycleII.java) | Medium | | | 167 | 两数之和 II - 输入有序数组 Two Sum II - Input array is sorted | [Java](leetcode/src/main/java/leetcode/__0167_TwoSumII.java) | Easy | | | 234 | 回文链表 Palindrome Linked List | [Java](leetcode/src/main/java/leetcode/_0234_PalindromeLinkedList.java) | Easy | | | 283 | 移动零 Move Zeroes | [Java](leetcode/src/main/java/leetcode/_0283_MoveZeroes.java) | Easy | | | 287 | 寻找重复数 Find the Duplicate Number | [Java](leetcode/src/main/java/leetcode/_0287_FindTheDuplicateNumber.java) | Medium | | ### 递归与动态规划 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 338 | 比特位计数 Counting Bits | [Java](leetcode/src/main/java/leetcode/_0338_CountingBits.java) | Medium | | | 416 | 分割等和子集 Partition Equal Subset Sum | [Java](leetcode/src/main/java/leetcode/_0416_PartitionEqualSubsetSum.java) | Medium | | | 494 | 目标和 Target Sum | [Java](leetcode/src/main/java/leetcode/_0494_TargetSum.java) | Medium | | | 647 | 回文子串 Palindromic Substrings | [Java](leetcode/src/main/java/leetcode/_0647_PalindromicSubstrings.java) | Medium | | ### 贪心 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 55 | 跳跃游戏 Jump Game | [Java](leetcode/src/main/java/leetcode/_0055_JumpGame.java) | Medium | | | 406 | 根据身高重建队列 Queue Reconstruction by Height | [Java](leetcode/src/main/java/leetcode/_0406_QueueReconstructionByHeight.java) | Medium | | ### 分治 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 53 | 最大子序和 Maximum Subarray | [Java](leetcode/src/main/java/leetcode/_0053_MaximumSubarray.java) | Easy | | | 169 | 多数元素 Majority Element | [Java](leetcode/src/main/java/leetcode/_0169_MajorityElement.java) | Easy | | | 215 | 数组中的第K个最大元素 Kth Largest Element in an Array | [Java](leetcode/src/main/java/leetcode/_0215_KthLargestElementInAnArray.java) | Medium | | | 240 | Search a 2D Matrix II | [Java](leetcode/src/main/java/leetcode/_0240_SearchA2DMatrixII.java) | Medium | | ### 搜索 #### 回溯 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 17 | 电话号码的字母组合 Letter Combinations of a Phone Number | [Java](leetcode/src/main/java/leetcode/_0017_LetterCombinationsOfAPhoneNumber.java) | Medium | | | 22 | 括号生成 Generate Parentheses | [Java](leetcode/src/main/java/leetcode/_0022_GenerateParentheses.java) | Medium | | | 39 | 组合总和 Combination Sum | [Java](leetcode/src/main/java/leetcode/_0039_CombinationSum.java) | Medium | | | 46 | 全排列 Permutations | [Java](leetcode/src/main/java/leetcode/_0046_Permutations.java) | Medium | | | 78 | 子集 Subsets | [Java](leetcode/src/main/java/leetcode/_0078_Subsets.java) | Medium | | | 79 | 单词搜索 Word Search | [Java](leetcode/src/main/java/leetcode/_0079_WordSearch.java) | Medium | | ### 位运算 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 78 | 子集 Subsets | [Java](leetcode/src/main/java/leetcode/_0078_Subsets.java) | Medium | | | 136 | 只出现一次的数字 Single Number | [Java](leetcode/src/main/java/leetcode/_0136_SingleNumber.java) | Easy | | | 169 | 多数元素 Majority Element | [Java](leetcode/src/main/java/leetcode/_0169_MajorityElement.java) | Easy | | | 338 | 比特位计数 Counting Bits | [Java](leetcode/src/main/java/leetcode/_0338_CountingBits.java) | Medium | | | 461 | 汉明距离 Hamming Distance | [Java](leetcode/src/main/java/leetcode/_0461_HammingDistance.java) | Easy | | ### 滑动窗口 | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|------| | 3 | 无重复字符的最长子串 Longest Substring Without Repeating Characters | [Java](leetcode/src/main/java/leetcode/_0003_LongestSubstringWithoutRepeatingCharacters.java) | Medium | | --- ## Top 100 Liked Questions | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|-----| | 1 | 两数之和 Two Sum | [Java](leetcode/src/main/java/leetcode/_0001_TwoSum.java) | Easy | | | 2 | Add Two Numbers | [Java](leetcode/src/main/java/leetcode/_0002_AddTwoNumbers.java) | Medium | | | 3 | 无重复字符的最长子串 Longest Substring Without Repeating Characters | [Java](leetcode/src/main/java/leetcode/_0003_LongestSubstringWithoutRepeatingCharacters.java) | Medium | | | 5 | 最长回文子串 Longest Palindromic Substring | [Java](leetcode/src/main/java/leetcode/_0005_LongestPalindromicSubstring.java) | Medium | | | 11 | 盛最多水的容器 Container With Most Water | [Java](leetcode/src/main/java/leetcode/_0011_ContainerWithMostWater.java) | Medium | | | 15 | 三数之和 3Sum | [Java](leetcode/src/main/java/leetcode/_0015_3Sum.java) | Medium | | | 16 | 最接近的三数之和 3Sum Closest | [Java](leetcode/src/main/java/leetcode/_0016_3SumClosest.java) | Medium | | | 17 | 电话号码的字母组合 Letter Combinations of a Phone Number | [Java](leetcode/src/main/java/leetcode/_0017_LetterCombinationsOfAPhoneNumber.java) | Medium | | | 19 | 删除链表的倒数第N个节点 Remove Nth Node From End of List | [Java](leetcode/src/main/java/leetcode/_0019_RemoveNthNodeFromEndOfList.java) | Medium | | | 20 | 有效的括号 Valid Parentheses | [Java](leetcode/src/main/java/leetcode/_0020_ValidParentheses.java) | Easy | | | 21 | Merge Two Sorted Lists | [Java](leetcode/src/main/java/leetcode/_0021_MergeTwoSortedLists.java) | Easy | | | 22 | 括号生成 Generate Parentheses | [Java](leetcode/src/main/java/leetcode/_0022_GenerateParentheses.java) | Medium | | | 31 | Next Permutation | [Java](leetcode/src/main/java/leetcode/_0031_NextPermutation.java) | Medium | | | 34 | 在排序数组中查找元素的第一个和最后一个位置 Find First and Last Position of Element in Sorted Array | [Java](leetcode/src/main/java/leetcode/_0034_FirstAndLastPositionOfElementInSortedArray.java) | Medium | | | 39 | 组合总和 Combination Sum | [Java](leetcode/src/main/java/leetcode/_0039_CombinationSum.java) | Medium | | | 46 | 全排列 Permutations | [Java](leetcode/src/main/java/leetcode/_0046_Permutations.java) | Medium | | | 48 | Rotate Image | [Java](leetcode/src/main/java/leetcode/_0048_RotateImage.java) | Medium | | | 49 | 字母异位词分组 Group Anagrams | [Java](leetcode/src/main/java/leetcode/_0049_GroupAnagrams.java) | Medium | | | 53 | 最大子序和 Maximum Subarray | [Java](leetcode/src/main/java/leetcode/_0053_MaximumSubarray.java) | Easy | | | 55 | 跳跃游戏 Jump Game | [Java](leetcode/src/main/java/leetcode/_0055_JumpGame.java) | Medium | | | 56 | 合并区间 Merge Intervals | [Java](leetcode/src/main/java/leetcode/_0056_MergeIntervals.java) | Medium | | | 62 | Unique Paths | [Java](leetcode/src/main/java/leetcode/_0062_UniquePaths.java) | Medium | | | 62 | Minimum Path Sum | [Java](leetcode/src/main/java/leetcode/_0064_MinimumPathSum.java) | Medium | | | 70 | Climbing Stairs | [Java](leetcode/src/main/java/leetcode/_0070_ClimbingStairs.java) | Easy | | | 75 | 颜色分类 Sort Colors | [Java](leetcode/src/main/java/leetcode/_0075_SortColors.java) | Medium | | | 78 | 子集 Subsets | [Java](leetcode/src/main/java/leetcode/_0078_Subsets.java) | Medium | | | 79 | 单词搜索 Word Search | [Java](leetcode/src/main/java/leetcode/_0079_WordSearch.java) | Medium | | | 94 | 二叉树的中序遍历 Binary Tree Inorder | [Java](leetcode/src/main/java/leetcode/_0094_BinaryTreeInorderTraversal.java) | Medium | | | 96 | 不同的二叉搜索树 Unique Binary Search Trees | [Java](leetcode/src/main/java/leetcode/_0096_UniqueBinarySearchTrees.java) | Medium | | | 98 | 验证二叉搜索树 Validate Binary Search Tree | [Java](leetcode/src/main/java/leetcode/_0098_ValidateBinarySearchTree.java) | Medium | | | 101 | 对称二叉树 Symmetric Tree | [Java](leetcode/src/main/java/leetcode/_0101_SymmetricTree.java) | Easy | | | 102 | 二叉树的层次遍历 Binary Tree Level Order Traversal | [Java](leetcode/src/main/java/leetcode/_0102_BinaryTreeLevelOrderTraversal.java) | Medium | | | 104 | 二叉树的最大深度 Maximum Depth of Binary Tree | [Java](leetcode/src/main/java/leetcode/_0104_MaximumDepthOfBinaryTree.java) | Easy | | | 105 | 从前序与中序遍历序列构造二叉树 Construct Binary Tree from Preorder and Inorder Traversal | [Java](leetcode/src/main/java/leetcode/_0105_ConstructBinaryTreeFromPreorderAndInorderTraversal.java) | Medium | | | 114 | 二叉树展开为链表 Flatten Binary Tree to Linked List | [Java](leetcode/src/main/java/leetcode/_0114_FlattenBinaryTreeToLinkedList.java) | Medium | | | 121 | Best Time to Buy and Sell Stock | [Java](leetcode/src/main/java/leetcode/_0121_BestTimeToBuyAndSellSock.java) | Easy | | | 124 | 二叉树中的最大路径和 Binary Tree Maximum Path Sum | [Java](leetcode/src/main/java/leetcode/_0124_BinaryTreeMaximumPathSum.java) | Hard | | | 136 | 只出现一次的数字 Single Number | [Java](leetcode/src/main/java/leetcode/_0136_SingleNumber.java) | Easy | | | 139 | Word Break | [Java](leetcode/src/main/java/leetcode/_0139_WordBreak.java) | Medium | | | 141 | 环形链表 Linked List Cycle | [Java](leetcode/src/main/java/leetcode/_0141_LinkedListCycle.java) | Easy | | | 142 | 环形链表 II Linked List Cycle II | [Java](leetcode/src/main/java/leetcode/_0142_LinkedListCycleII.java) | Medium | | | 146 | LRU Cache | [Java](leetcode/src/main/java/leetcode/_0146_LRUCache.java) | Medium | | | 148 | 排序链表 Sort List | [Java](leetcode/src/main/java/leetcode/_0148_SortList.java) | Medium | | | 152 | Maximum Product Subarray | [Java](leetcode/src/main/java/leetcode/_0152_MaximumProductSubarray.java) | Medium | | | 155 | Min Stack | [Java](leetcode/src/main/java/leetcode/_0155_MinStack.java) | Easy | | | 160 | Intersection of Two Linked Lists | [Java](leetcode/src/main/java/leetcode/_0160_IntersectionOfTwoLinkedLists.java) | Easy | | | 169 | 多数元素 Majority Element | [Java](leetcode/src/main/java/leetcode/_0169_MajorityElement.java) | Easy | | | 198 | House Robber | [Java](leetcode/src/main/java/leetcode/_0198_HouseRobber.java) | Easy | | | 200 | Number of Islands | [Java](leetcode/src/main/java/leetcode/_0200_NumberOfIslands.java) | Medium | | | 206 | Reverse Linked List | [Java](leetcode/src/main/java/leetcode/_0206_ReverseLinkedList.java) | Easy | | | 207 | 课程表 Course Schedule | [Java](leetcode/src/main/java/leetcode/_0207_CourseSchedule.java) | Medium | | | 208 | 实现 Trie (前缀树) Implement Trie (Prefix Tree) | [Java](leetcode/src/main/java/leetcode/_0208_ImplementTrie.java) | Medium | | | 215 | 数组中的第K个最大元素 Kth Largest Element in an Array | [Java](leetcode/src/main/java/leetcode/_0215_KthLargestElementInAnArray.java) | Medium | | | 221 | Maximal Square | [Java](leetcode/src/main/java/leetcode/_0221_MaximalSquare.java) | Medium | | | 226 | 翻转二叉树 Invert Binary Tree | [Java](leetcode/src/main/java/leetcode/_0226_InvertBinaryTree.java) | Easy | | | 234 | 回文链表 Palindrome Linked List | [Java](leetcode/src/main/java/leetcode/_0234_PalindromeLinkedList.java) | Easy | | | 236 | 二叉树的最近公共祖先 Lowest Common Ancestor of a Binary Tree | [Java](leetcode/src/main/java/leetcode/_0236_LowestCommonAncestorOfABinaryTree.java) | Medium | | | 238 | Product of Array Except Self | [Java](leetcode/src/main/java/leetcode/_0238_ProductOfArrayExceptSelf.java) | Medium | | | 240 | 搜索二维矩阵 II Search a 2D Matrix II | [Java](leetcode/src/main/java/leetcode/_0240_SearchA2DMatrixII.java) | Medium | | | 253 | **Meeting Rooms II** | [Java](leetcode/src/main/java/leetcode/_0253_MeetingRoomsII.java) | Medium | | | 279 | Perfect Squares | [Java](leetcode/src/main/java/leetcode/_0279_PerfectSquares.java) | Medium | | | 283 | 移动零 Move Zeroes | [Java](leetcode/src/main/java/leetcode/_0283_MoveZeroes.java) | Easy | | | 287 | 寻找重复数 Find the Duplicate Number | [Java](leetcode/src/main/java/leetcode/_0287_FindTheDuplicateNumber.java) | Medium | | | 300 | 最长上升子序列 Longest Increasing Subsequence | [Java](leetcode/src/main/java/leetcode/_0300_LongestIncreasingSubsequence.java) | Medium | | | 309 | Best Time to Buy and Sell Stock with Cooldown | [Java](leetcode/src/main/java/leetcode/_0309_BestTimeToBuyAndSellStockWithCooldown.java) | Medium | | | 322 | Coin Change | [Java](leetcode/src/main/java/leetcode/_0322_CoinChange.java) | Medium | | | 337 | 打家劫舍 III House Robber III | [Java](leetcode/src/main/java/leetcode/_0337_HouseRobberIII.java) | Medium | | | 338 | 比特位计数 Counting Bits | [Java](leetcode/src/main/java/leetcode/_0338_CountingBits.java) | Medium | | | 347 | 前 K 个高频元素 Top K Frequent Elements | [Java](leetcode/src/main/java/leetcode/_0347_TopKFrequentElements.java) | Medium | | | 394 | Decode String | [Java](leetcode/src/main/java/leetcode/_0394_DecodeString.java) | Medium | | | 399 | Evaluate Division | [Java](leetcode/src/main/java/leetcode/_0399_EvaluateDivision.java) | Medium | | | 406 | 根据身高重建队列 Queue Reconstruction by Height | [Java](leetcode/src/main/java/leetcode/_0406_QueueReconstructionByHeight.java) | Medium | | | 416 | 分割等和子集 Partition Equal Subset Sum | [Java](leetcode/src/main/java/leetcode/_0416_PartitionEqualSubsetSum.java) | Medium | | | 437 | 路径总和 III Path Sum III | [Java](leetcode/src/main/java/leetcode/_0437_PathSumIII.java) | Easy | | | 438 | 找到字符串中所有字母异位词 Find All Anagrams in a String | [Java](leetcode/src/main/java/leetcode/_0438_FindAllAnagramsInAString.java) | Medium | | | 448 | Find All Numbers Disappeared in an Array | [Java](leetcode/src/main/java/leetcode/_0448_FindAllNumbersDisappearedInAnArray.java) | Easy | | | 461 | 汉明距离 Hamming Distance | [Java](leetcode/src/main/java/leetcode/_0461_HammingDistance.java) | Easy | | | 494 | 目标和 Target Sum | [Java](leetcode/src/main/java/leetcode/_0494_TargetSum.java) | Medium | | | 538 | 把二叉搜索树转换为累加树 Convert BST to Greater Tree | [Java](leetcode/src/main/java/leetcode/_0538_ConvertBSTToGreaterTree.java) | Easy | | | 543 | 二叉树的直径 Diameter of Binary Tree | [Java](leetcode/src/main/java/leetcode/_0543_DiameterOfBinaryTree.java) | Easy | | | 560 | 和为K的子数组 Subarray Sum Equals K | [Java](leetcode/src/main/java/leetcode/_0560_SubarraySumEqualsK.java) | Medium | | | 581 | Shortest Unsorted Continuous Subarray | [Java](leetcode/src/main/java/leetcode/_581_ShortestUnsortedContinuousSubarray.java) | Easy | | | 617 | 合并二叉树 Merge Two Binary Trees | [Java](leetcode/src/main/java/leetcode/_0617_MergeTwoBinaryTrees.java) | Easy | | | 647 | 回文子串 Palindromic Substrings | [Java](leetcode/src/main/java/leetcode/_0647_PalindromicSubstrings.java) | Medium | | Note: 着重体的问题表示未开放。 --- ## All Questions | No | Problem | Solution | Difficulty | Tag | |------|---------|----------|------------|-----| | 167 | 两数之和 II - 输入有序数组 Two Sum II - Input array is sorted | [Java](leetcode/src/main/java/leetcode/__0167_TwoSumII.java) | Easy | | | 257 | 二叉树路径 Binary Tree Paths | [Java](leetcode/src/main/java/leetcode/_0257_BinaryTreePaths.java) | Easy | | --- # 剑指offer > > [**剑指offerV2源码**](interview-for-offer/src/main/java/offerV2) > > [剑指offer V1编程题目录](interview-for-offer/README.md) > > [《剑指offer V1》编程题源码](https://github.com/li-yazhou/algorithm-primer/tree/master/interview-for-offer/src/main/java/algorithm/foroffer) > > [《剑指offer V1》编程题Markdown](https://github.com/li-yazhou/algorithm-primer/tree/master/interview-for-offer/md) > > [剑指offer V1 编程题汇总](interview-for-offer/md/剑指offer面试题汇总.md) > ## 剑指offer V2分类 ### 剑指offer 数组与哈希表 | No | Leetcode | Problem & Solution | Tag | | ------ | ------ |------------------ | ----- | | 003 | | [数组中重复的数字](interview-for-offer/src/main/java/offerV2/_003_Repeat_Num_In_Array.java) | 数组 | | 004 | | [二维数组中的查找](interview-for-offer/src/main/java/offerV2/_004_Find_Element_In_2D_Array.java) | 数组 | | 011 | | [旋转数组中的最小数字](interview-for-offer/src/main/java/offerV2/_011_Min_Element_In_Rotate_Array.java) | 数组与二分查找 | | 017 | | [打印从 1 到最大的 n 位数](interview-for-offer/src/main/java/offerV2/_017_Print_1_To_BigInt.java) | 数组、大整数 | | 021 | | [调整数组顺序使奇数位于偶数前面](interview-for-offer/src/main/java/offerV2/_021_Move_Odd_Even_Num.java) | 数组、快排 | | 039 | | [数组中出现次数超过一半的数字](interview-for-offer/src/main/java/offerV2/_039_Half_Same_Element_In_Array.java) | 数组、多数投票问题 | | 040 | | [最小的 k 个数](interview-for-offer/src/main/java/offerV2/_040_Min_K_In_Array.java) | 数组、topK、大根堆 | | 041 | | [数据流中的中位数](interview-for-offer/src/main/java/offerV2/_041_Medain_Num_In_Stream.java) | 数组、大根堆、小根堆 | | 041-2 | | [字符流中第一个不重复的字符](interview-for-offer/src/main/java/offerV2/_041_First_Distinct_Char_In_Stream.java) | 字符的数组索引、队列 | | 050 | | [第一个只出现一次的字符](interview-for-offer/src/main/java/offerV2/_050_First_Not_Repeat_Char.java) | 数组、数组索引、哈希表、比特位集 | | 053 | | [数字在排序数组中出现的次数](interview-for-offer/src/main/java/offerV2/_053_Occurence_Count_In_Sorted_Array.java) | 数组、折半查找 | | 056 | | [数组中只出现一次的数字](interview-for-offer/src/main/java/offerV2/_056_Appear_Once_Num.java) | 位运算、数组 | | 057 | | [有序数组中查找和为s的两个数](interview-for-offer/src/main/java/offerV2/_057_Find_2Num_Equal_Value_In_Sorted_Array.java) | 数组、双指针 | | 058 | | [翻转单词顺序](interview-for-offer/src/main/java/offerV2/_058_Reverse_Words.java) | 数组、字符串 | | 058-2 | | [左旋转字符串](interview-for-offer/src/main/java/offerV2/_058_Rotate_String.java) | 数组、字符串 | | 061 | | [扑克牌的顺子](interview-for-offer/src/main/java/offerV2/_061_Poker_Seq.java) | 数组 | | 065 | | [构建乘积数组](interview-for-offer/src/main/java/offerV2/_066_Multiply_Array.java) | 数组 | ### 剑指offer 链表 | No | Problem & Solution | Tag | | ------ | ------------------ | ----- | | 006 | [从尾到头打印链表](interview-for-offer/src/main/java/offerV2/_006_Print_List_From_Tail.java) | 链表 | | 018-1 | [在 O(1) 时间删除链表结点](interview-for-offer/src/main/java/offerV2/_018_Delete_ListNode_O1.java) | 链表 | | 018-2 | [删除链表中重复的结点](interview-for-offer/src/main/java/offerV2/_018_Delete_Duplicate_ListNode.java) | 链表 | | 022 | [链表中倒数第 k 个节点](interview-for-offer/src/main/java/offerV2/_022_Kth_ListNode_From_Tail.java) | 链表、双指针 | | 023 | [链表中环的入口结点](interview-for-offer/src/main/java/offerV2/_023_Circle_List_Entrance.java) | 链表、双指针 | | 024 | [反转链表](interview-for-offer/src/main/java/offerV2/_024_Reverse_List.java) | 链表、递归 | | 035 | [复杂链表的复制](interview-for-offer/src/main/java/offerV2/_035_Complex_List_Copy.java) | 链表 | ### 剑指offer 二叉树 | No | Leetcode | Problem & Solution | Tag | | ------ | ------ | ------------------ | ----- | | 007 | | [根据前序和中序遍历结果重建二叉树](interview-for-offer/src/main/java/offerV2/_007_Rebuild_Tree_By_PreOrder_InOrder_Seq.java) | 二叉树 | | 008 | | [查找二叉树指定节点的中序遍历的下一个节点](interview-for-offer/src/main/java/offerV2/_008_Inorder_Next_TreeNode.java) | 二叉树 | | 026 | | [树的子结构](interview-for-offer/src/main/java/offerV2/_026_Sub_Tree.java) | 二叉树、递归 | | 027 | | [二叉树的镜像](interview-for-offer/src/main/java/offerV2/_027_Mirror_BinTree.java) | 二叉树、递归 | | 028 | | [对称的二叉树](interview-for-offer/src/main/java/offerV2/_028_Symmetrical_BinTree.jaca) | 二叉树、递归 | | 032 | | [从上到下打印二叉树](interview-for-offer/src/main/java/offerV2/_032_BinTree_Level_Visit.java) | 二叉树、层次遍历、队列 | | 032-2 | | [把二叉树打印成多行](interview-for-offer/src/main/java/offerV2/_032_BinTree_Level_Visit_With_Line.java) | 二叉树、层次遍历、队列 | | 032-3 | | [按之字形顺序打印二叉树](interview-for-offer/src/main/java/offerV2/_032_BinTree_Level_Visit_With_Line.java) | 二叉树、层次遍历、队列、栈 | | 033 | | [二叉搜索树的后序遍历序列](interview-for-offer/src/main/java/offerV2/_033_Search_BinTree_PostOrder_Check.java) | 二叉搜索树、后序遍历 | | 034 | | [二叉树中和为某一值的路径](interview-for-offer/src/main/java/offerV2/_034_Find_Path_Sum_In_BinTree.java) | 二叉树路径、递归 | | 036 | | [二叉搜索树与双向链表](interview-for-offer/src/main/java/offerV2/_036_BST_To_Dual_List.java) | 二叉搜索树、双向链表 | | 037 | | [序列化二叉树](interview-for-offer/src/main/java/offerV2/_037_BinTree_Serialize.java) | 二叉树、递归 | | 054 | | [二叉搜索树的第k个结点](interview-for-offer/src/main/java/offerV2/_054_Search_Tree_Kth_Node.java) | 二叉搜索树、中序遍历 | | 055 | | [二叉树的深度](interview-for-offer/src/main/java/offerV2/__055_BinTree_Depth.java) | 二叉树、二叉树的遍历 | | 055-2 | | [平衡二叉树](interview-for-offer/src/main/java/offerV2/_055_Balance_Tree_Check.java) | 二叉树、二叉树的遍历 | | 068 | | [树中两个节点的最低公共祖先节点](interview-for-offer/src/main/java/offerV2/_068_Lowest_Common_Ancestor_TreeNode.java) | 二叉树、递归、树的路径 | ### 剑指offer 栈与队列 | No | Leetcode | Problem & Solution | Tag | | ------ | ------ | ------------------ | ----- | | 009 | | [用两个栈实现队列](interview-for-offer/src/main/java/offerV2/_009_2Stack_As_Queue.java) | 栈与队列 | | 059 | | [滑动窗口的最大值](interview-for-offer/src/main/java/offerV2/_059_Max_Value_In_Slide_Window.java) | 双端队列、大根堆 | ### 剑指offer 字符串 | No | Problem & Solution | Tag | | ------ | ------------------ | ----- | | 005 | [替换字符串中的空格](interview-for-offer/src/main/java/offerV2/_005_Replace_Blank_Space.java) | 字符串 | | 038 | [字符串的排列](interview-for-offer/src/main/java/offerV2/_038_Permutation_String.java) | 字符串、递归、回溯 | | 044 | [数字序列中的某一位数字](interview-for-offer/src/main/java/offerV2/_044_Kth_Digit.java) | 字符串 | | 045 | [把数组排成最小的数](interview-for-offer/src/main/java/offerV2/_045_Combine_Min_Num_By_Array.java) | 字符串、数组 | ### 剑指offer 位运算 | No | Leetcode | Problem & Solution | Tag | | ------ | ------ | ------------------ | ----- | | 015 | | [二进制中1的个数](interview-for-offer/src/main/java/offerV2/_015_Count_1_Num.java) | 位运算 | | 056 | | [数组中只出现一次的数字](interview-for-offer/src/main/java/offerV2/_056_Appear_Once_Num.java) | 位运算、数组 | ### 剑指offer 递归与动态规划 | No | Leetcode | Problem & Solution | Tag | | ------ | ------ | ------------------ | ----- | | 010-1 | | [斐波那契数列](interview-for-offer/src/main/java/offerV2/_010_Fibonacci_Seq.java) | 递归与动态规划 | | 010-2 | | [矩形覆盖](interview-for-offer/src/main/java/offerV2/_010_Rectangle_Coverage.java) | 递归与动态规划 | | 010-3 | | [跳台阶](interview-for-offer/src/main/java/offerV2/_010_Jump_Step.java) | 递归与动态规划 | | 010-4 | | [变态跳台阶](interview-for-offer/src/main/java/offerV2/_010_Random_Jump_Step.java) | 递归与动态规划 | | 012 | | [矩阵中的路径](interview-for-offer/src/main/java/offerV2/_012_Path_In_Matrix.java)| 递归、回溯、DFS | | 013 | | [机器人的运动范围](interview-for-offer/src/main/java/offerV2/_013_Robot_Move_Range.java) | 递归、回溯、DFS | | 016 | | [数值的整数次方](interview-for-offer/src/main/java/offerV2/_016_N_Power.java) | 递归 | | 049 | | [第 N 个丑数](interview-for-offer/src/main/java/offerV2/_049_Kth_Ugly_Num.java) | 动态规划 | | 062 | | [圆圈中最后剩下的数字](interview-for-offer/src/main/java/offerV2/_062_Joseph_Circle.java) | 递归 | | 063 | | [股票的最大利润](interview-for-offer/src/main/java/offerV2/_063_Max_Profit_Stock.java) | 动态规划、贪心 | | 064 | | [求前N个正整数之和](interview-for-offer/src/main/java/offerV2/_064_N_Num_Sum.java) | 递归 | --- ## 剑指offer V2 | No | Leetcode | Problem & Solution | Tag | | ------ | ------ | ------------------ | ----- | | 003 | | [数组中重复的数字](interview-for-offer/src/main/java/offerV2/_003_Repeat_Num_In_Array.java) | 数组 | | 004 | | [二维数组中的查找](interview-for-offer/src/main/java/offerV2/_004_Find_Element_In_2D_Array.java) | 数组 | | 005 | | [替换字符串中的空格](interview-for-offer/src/main/java/offerV2/_005_Replace_Blank_Space.java) | 字符串 | | 006 | | [从尾到头打印链表](interview-for-offer/src/main/java/offerV2/_006_Print_List_From_Tail.java) | 链表 | | 007 | | [根据前序和中序遍历结果重建二叉树](interview-for-offer/src/main/java/offerV2/_007_Rebuild_Tree_By_PreOrder_InOrder_Seq.java) | 二叉树 | | 008 | | [查找二叉树指定节点的中序遍历的下一个节点](interview-for-offer/src/main/java/offerV2/_008_Inorder_Next_TreeNode.java) | 二叉树 | | 009 | | [用两个栈实现队列](interview-for-offer/src/main/java/offerV2/_009_2Stack_As_Queue.java) | 栈与队列 | | 010-1 | | [斐波那契数列](interview-for-offer/src/main/java/offerV2/_010_Fibonacci_Seq.java) | 递归与动态规划 | | 010-2 | | [矩形覆盖](interview-for-offer/src/main/java/offerV2/_010_Rectangle_Coverage.java) | 递归与动态规划 | | 010-3 | | [跳台阶](interview-for-offer/src/main/java/offerV2/_010_Jump_Step.java) | 递归与动态规划 | | 010-4 | | [变态跳台阶](interview-for-offer/src/main/java/offerV2/_010_Random_Jump_Step.java) | 递归与动态规划 | | 011 | | [旋转数组中的最小数字](interview-for-offer/src/main/java/offerV2/_011_Min_Element_In_Rotate_Array.java) | 数组与二分查找 | | 012 | | [矩阵中的路径](interview-for-offer/src/main/java/offerV2/_012_Path_In_Matrix.java)| 递归、回溯、DFS | | 013 | | [机器人的运动范围](interview-for-offer/src/main/java/offerV2/_013_Robot_Move_Range.java) | 递归、回溯、DFS | | 014 | | 剪绳子使各段长度的乘积最大 | 贪心、动态规划 | | 015 | | [二进制中1的个数](interview-for-offer/src/main/java/offerV2/_015_Count_1_Num.java) | 位运算 | | 016 | | [数值的整数次方](interview-for-offer/src/main/java/offerV2/_016_N_Power.java) | 递归、折半 | | 017 | | [打印从 1 到最大的 n 位数](interview-for-offer/src/main/java/offerV2/_017_Print_1_To_BigInt.java) | 数组、大整数 | | 018-1 | | [在 O(1) 时间删除链表结点](interview-for-offer/src/main/java/offerV2/_018_Delete_ListNode_O1.java) | 链表 | | 018-2 | | [删除链表中重复的结点](interview-for-offer/src/main/java/offerV2/_018_Delete_Duplicate_ListNode.java) | 链表 | | 019 | | 正则表达式 | 动态规划 | | 020 | | 表示数值的字符串 | 字符串、正则表达式 | | 021 | | [调整数组顺序使奇数位于偶数前面](interview-for-offer/src/main/java/offerV2/_021_Move_Odd_Even_Num.java) | 数组、快排 | | 022 | | [链表中倒数第 k 个节点](interview-for-offer/src/main/java/offerV2/_022_Kth_ListNode_From_Tail.java) | 链表、双指针 | | 023 | | [链表中环的入口结点](interview-for-offer/src/main/java/offerV2/_023_Circle_List_Entrance.java) | 链表、双指针 | | 024 | | [反转链表](interview-for-offer/src/main/java/offerV2/_024_Reverse_List.java) | 链表、递归 | | 026 | | [树的子结构](interview-for-offer/src/main/java/offerV2/_026_Sub_Tree.java) | 二叉树、递归 | | 027 | | [二叉树的镜像](interview-for-offer/src/main/java/offerV2/_027_Mirror_BinTree.java) | 二叉树、递归 | | 028 | | [对称的二叉树](interview-for-offer/src/main/java/offerV2/_028_Symmetrical_BinTree.jaca) | 二叉树、递归 | | 029 | | 顺时针打印矩阵 | 数组 | | 030 | | [包含 min 函数的栈](interview-for-offer/src/main/java/offerV2/_030_Stack_With_Min_Value.java) | 栈 | | 031 | | [栈的压入、弹出序列](interview-for-offer/src/main/java/offerV2/_031_Validate_Stack_Pop_Seq.java) | 栈 | | 032 | | [从上到下打印二叉树](interview-for-offer/src/main/java/offerV2/_032_BinTree_Level_Visit.java) | 二叉树、层次遍历、队列 | | 032-2 | | [把二叉树打印成多行](interview-for-offer/src/main/java/offerV2/_032_BinTree_Level_Visit_With_Line.java) | 二叉树、层次遍历、队列 | | 032-3 | | [按之字形顺序打印二叉树](interview-for-offer/src/main/java/offerV2/_032_BinTree_Level_Visit_With_Line.java) | 二叉树、层次遍历、队列、栈 | | 033 | | [二叉搜索树的后序遍历序列](interview-for-offer/src/main/java/offerV2/_033_Search_BinTree_PostOrder_Check.java) | 二叉搜索树、后序遍历 | | 034 | | [二叉树中和为某一值的路径](interview-for-offer/src/main/java/offerV2/_034_Find_Path_Sum_In_BinTree.java) | 二叉树路径、递归 | | 035 | | [复杂链表的复制](interview-for-offer/src/main/java/offerV2/_035_Complex_List_Copy.java) | 链表 | | 036 | | [二叉搜索树与双向链表](interview-for-offer/src/main/java/offerV2/_036_BST_To_Dual_List.java) | 二叉搜索树、双向链表 | | 037 | | [序列化二叉树](interview-for-offer/src/main/java/offerV2/_037_BinTree_Serialize.java) | 二叉树、递归 | | 038 | | [字符串的排列](interview-for-offer/src/main/java/offerV2/_038_Permutation_String.java) | 字符串、递归、回溯 | | 039 | | [数组中出现次数超过一半的数字](interview-for-offer/src/main/java/offerV2/_039_Half_Same_Element_In_Array.java) | 数组、多数投票问题 | | 040 | | [最小的 k 个数](interview-for-offer/src/main/java/offerV2/_040_Min_K_In_Array.java) | 数组、topK、大根堆 | | 041 | | [数据流中的中位数](interview-for-offer/src/main/java/offerV2/_041_Medain_Num_In_Stream.java) | 数组、大根堆、小根堆 | | 041-2 | | [字符流中第一个不重复的字符](interview-for-offer/src/main/java/offerV2/_041_First_Distinct_Char_In_Stream.java) | 字符的数组索引、队列 | | 042 | | [连续子数组的最大和](interview-for-offer/src/main/java/offerV2/_043_Subseq_Max_Sum.java) | 数组、动态规划 | | 043 | | 从 1 到 n 整数中 1 出现的次数 | | | 044 | | [数字序列中的某一位数字](interview-for-offer/src/main/java/offerV2/_044_Kth_Digit.java) | 字符串 | | 045 | | [把数组排成最小的数](interview-for-offer/src/main/java/offerV2/_045_Combine_Min_Num_By_Array.java) | 字符串、数组 | | 046 | | 把数字翻译成字符串 | 动态规划 | | 047 | | 礼物的最大价值 | 动态规划 | | 048 | | 最长不含重复字符的子字符串 | | | 049 | | [第 N 个丑数](interview-for-offer/src/main/java/offerV2/_049_Kth_Ugly_Num.java) | 动态规划 | | 050 | | [第一个只出现一次的字符](interview-for-offer/src/main/java/offerV2/_050_First_Not_Repeat_Char.java) | 数组、数组索引、哈希表、比特位集 | | 051 | | 数组中的逆序对 | 数组、排序 | | 052 | | [两个链表的第一个公共结点](interview-for-offer/src/main/java/offerV2/_052_First_Common_ListNode.java) | 链表、双指针 | | 053 | | [数字在排序数组中出现的次数](interview-for-offer/src/main/java/offerV2/_053_Occurence_Count_In_Sorted_Array.java) | 数组、折半查找 | | 054 | | [二叉搜索树的第k个结点](interview-for-offer/src/main/java/offerV2/_054_Search_Tree_Kth_Node.java) | 二叉搜索树、中序遍历 | | 055 | | [二叉树的深度](interview-for-offer/src/main/java/offerV2/__055_BinTree_Depth.java) | 二叉树、二叉树的遍历 | | 055-2 | | [平衡二叉树](interview-for-offer/src/main/java/offerV2/_055_Balance_Tree_Check.java) | 二叉树、二叉树的遍历 | | 056 | | [数组中只出现一次的数字](interview-for-offer/src/main/java/offerV2/_056_Appear_Once_Num.java) | 位运算、数组 | | 057 | | [有序数组中查找和为s的两个数](interview-for-offer/src/main/java/offerV2/_057_Find_2Num_Equal_Value_In_Sorted_Array.java) | 数组、双指针 | | 057-2 | | [为 s 的连续正数序列](interview-for-offer/src/main/java/offerV2/_057_Find_Seq_Sum_Equal_Value.java) | 数组、双指针 | | 058 | | [翻转单词顺序](interview-for-offer/src/main/java/offerV2/_058_Reverse_Words.java) | 数组、字符串 | | 058-2 | | [左旋转字符串](interview-for-offer/src/main/java/offerV2/_058_Rotate_String.java) | 数组、字符串 | | 059 | | [滑动窗口的最大值](interview-for-offer/src/main/java/offerV2/_059_Max_Value_In_Slide_Window.java) | 双端队列、大根堆 | | 060 | | n 个骰子的点数 | | | 061 | | [扑克牌的顺子](interview-for-offer/src/main/java/offerV2/_061_Poker_Seq.java) | 数组 | | 062 | | [圆圈中最后剩下的数字](interview-for-offer/src/main/java/offerV2/_062_Joseph_Circle.java) | 递归 | | 063 | | [股票的最大利润](interview-for-offer/src/main/java/offerV2/_063_Max_Profit_Stock.java) | 动态规划、贪心 | | 064 | | [求前N个正整数之和](interview-for-offer/src/main/java/offerV2/_064_N_Num_Sum.java) | 递归 | | 065 | | 不用加减乘除做加法 | 位运算、递归 | | 066 | | [构建乘积数组](interview-for-offer/src/main/java/offerV2/_066_Multiply_Array.java) | 数组 | | 067 | | [把字符串转换成整数](interview-for-offer/src/main/java/offerV2/_067_Cast_String_To_Int.java) | 字符串 | | 068 | | [树中两个节点的最低公共祖先节点](interview-for-offer/src/main/java/offerV2/_068_Lowest_Common_Ancestor_TreeNode.java) | 二叉树、递归、树的路径 | --- ## 剑指offer V1 | No | Problem & Solution | | --- | --- | | 2 | [实现单例模式](interview-for-offer/md/002-单例模式.md) | | 3 | [二维数组中的查找](interview-for-offer/md/003-二维数组中的查找.md) | | 4 | [替换空格](interview-for-offer/md/004-替换空格.md) | | 5 | [从尾到头打印链表](interview-for-offer/md/005-从头到尾打印链表.md) | | 6 | [重建二叉树2](interview-for-offer/md/006-重建二叉树.md) | | 7 | [用两个栈实现队列](interview-for-offer/md/007-用两个栈实现队列.md) | | 8 | [旋转数组的最小数字](interview-for-offer/md/008-旋转数组的最小数字.md) | | 9 | [斐波那契数列/青蛙跳台阶/矩形覆盖/变态跳台阶](interview-for-offer/md/009-斐波那契数列-青蛙跳台阶-矩形覆盖-变态跳台阶.md) | | 10 | [二进制中 1 的个数](interview-for-offer/md/010-二进制中1的个数.md) | | 11 | [数值的整数次方](interview-for-offer/md/011-数值的整数次方.md) | | 12 | [打印 1 到最大的 n 位整数](interview-for-offer/md/012-打印1到最大的n位整数.md) | | 13 | [在 o(1) 时间删除链表结点](interview-for-offer/md/013-在o(1)时间删除链表结点.md) | | 14 | [调整数组顺序使奇数位于偶数前面](interview-for-offer/md/014-调整数组顺序使奇数位于偶数前面.md) | | 15 | [链表中倒数第 k 个节点](interview-for-offer/md/015-链表中倒数第k个结点.md) | | 16 | [反转链表](interview-for-offer/md/016-反转链表.md) | | 17 | [合并两个排序的链表](interview-for-offer/md/017-合并两个排序的链表.md) | | 18 | [树的子结构](interview-for-offer/md/018-树的子结构.md) | | 19 | [二叉树的镜像](interview-for-offer/md/019-二叉树的镜像.md) | | 20 | [顺时针打印矩阵](interview-for-offer/md/020-顺时针打印矩阵.md) | | 21 | [包含 min 函数的栈](interview-for-offer/md/021-包含min函数的栈.md) | | 22 | [栈的压入、弹出序列](interview-for-offer/md/022-栈的压入和弹出序列.md) | | 23 | [从上到下打印二叉树](interview-for-offer/md/023-从上到下打印二叉树.md) | | 24 | [二叉搜索树的后序遍历序列](interview-for-offer/md/024-二叉搜索树的后序遍历序列.md) | | 25 | [二叉树中和为某一值的路径](interview-for-offer/md/025-二叉树中和为某一值的路径.md) | | 26 | [复杂链表的复制](interview-for-offer/md/026-复杂链表的复制.md) | | 27 | [二叉搜索树与双向链表](interview-for-offer/md/027-二叉搜索树与双向链表.md) | | 28 | [字符串的排列](interview-for-offer/md/028-字符串的排列.md) | | 29 | [数组中出现次数超过一半的数字](interview-for-offer/md/029-数组中出现次数超过一半的数字.md) | | 30 | [最小的 k 个数](interview-for-offer/md/030-最小的k个数.md) | | 31 | [连续子数组的最大和](interview-for-offer/md/031-连续子数组的最大和.md) | | 32 | [从 1 到 n 整数中 1 出现的次数](interview-for-offer/md/032-从1到n整数中1出现的次数.md) | | 33 | [把数组排成最小的数](interview-for-offer/md/033-把数组排成最小的数.md) | | 34 | [丑数](interview-for-offer/md/034-丑数.md) | | 35 | [第一个只出现一次的字符](interview-for-offer/md/035-第一个只出现一次的字符.md) | | 36 | [数组中的逆数对](interview-for-offer/md/036-数组中的逆数对.md) | | 37 | [两个链表的第一个公共结点](interview-for-offer/md/037-两个链表的第一个公共结点.md) | | 38 | [数字在排序数组中出现的次数](interview-for-offer/md/038-数字在排序数组中出现的次数.md) | | 39 | [二叉树的深度](interview-for-offer/md/039-二叉树的深度.md) | | 40 | [数组中只出现一次的数字](interview-for-offer/md/040-数组中只出现一次的数字.md) | | 41 | [和为 s 的两个数字 VS 和为 s 的连续正数序列](interview-for-offer/md/041-和为s的两个数字VS和为s的连续正数序列.md) | | 42 | [翻转单词顺序 VS 左旋转字符串](interview-for-offer/md/042-翻转单词顺序VS左旋转字符串.md) | | 43 | [n 个骰子的点数]() | | 44 | [扑克牌的顺子](interview-for-offer/md/044-扑克牌的顺子.md) | | 45 | [圆圈中最后剩下的数字](interview-for-offer/md/045-圆圈中最后剩下的数字.md) | | 46 | [求前 n 项正整数的和(不能使用乘除法以及for、while、if 等关键字)](interview-for-offer/md/046-不使用乘除与判断求前N项正整数的和.md) | | 47 | [不用加减乘除做加法](interview-for-offer/md/047-不用加减乘除做加法.md) | | 48 | [不能被继承的类](interview-for-offer/md/048-不能被继承的类.md) | | 49 | [把字符串转换成整数](interview-for-offer/md/049-把字符串转换成整数.md) | | 50 | [树中两个结点的最低公共祖先结点](interview-for-offer/md/050-树中两个结点的最低公共祖先结点.md) | | 51 | [数组中重复的数字](interview-for-offer/md/051-数组中重复的数字.md) | | 52 | [构建乘积数组](interview-for-offer/md/052-构建乘积数组.md) | | 55 | [字符流中第一个不重复的字符](interview-for-offer/md/055-字符流中第一个不重复的字符.md) | | 56 | [链表中环的入口结点](interview-for-offer/md/056-链表中环的入口结点.md) | | 57 | [删除链表中重复的结点](interview-for-offer/md/057-删除链表中重复的结点.md) | | 58 | [二叉树的下一个结点](interview-for-offer/md/058-二叉树的下一个结点.md) | | 59 | [对称的二叉树](interview-for-offer/md/059-对称的二叉树.md) | | 60 | [把二叉树打印成多行](interview-for-offer/md/060-把二叉树打印成多行.md) | | 61 | [按之字形顺序打印二叉树](interview-for-offer/md/061-按之字形顺序打印二叉树.md) | | 62 | [序列化二叉树](interview-for-offer/md/062-序列化和反序列化二叉树.md) | | 63 | [二叉搜索树的第k个结点](interview-for-offer/md/063-二叉搜索树的第k个结点.md) | | 64 | [数据流中的中位数](interview-for-offer/md/064-数据流中的中位数.md) | | 65 | [滑动窗口的最大值](interview-for-offer/md/065-滑动窗口的最大值.md) | --- # 参考 * [leetcode overview](https://leetcode.com/problemset/all/) * 《程序员代码面试指南 第2版》 * 《剑指offer 第2版》 * 《编程之美》 * 《编程珠玑》 * 《算法 第4版》 * 《算法导论 第3版》