![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构算法练习
文章平均质量分 85
数据结构算法练习
借点头发吧
这个作者很懒,什么都没留下…
展开
-
一些lc周赛
一些lc周赛原创 2023-01-29 17:09:32 · 517 阅读 · 1 评论 -
lc hot100+javase整理
lc hot100+javase整理原创 2022-08-28 15:48:02 · 738 阅读 · 0 评论 -
剑指整理+javase基础回顾
剑指整理+javase基础回顾原创 2022-06-30 17:05:17 · 339 阅读 · 0 评论 -
前缀、差分数组+应用【思维导图】
前缀、差分差分场景频繁对原始数组的某个区间的元素进⾏增减构造diff 差分数组思路对区间 nums[i…j] 的元素全部+x只需要让 diff[i] += x,diff[j+1] -= x根据反推diff[i] += x :给 nums[i]后所有的元素加xdiff[j+1] -= x :给nums[j+1]后所有元素减x 合并即为对区间[i…j] 中的所有元素都加xdiff[i] = nums[i] - nums[i - 1];反推:res[i].原创 2022-03-13 15:28:26 · 413 阅读 · 0 评论 -
动态规划 回溯 记忆化回溯 139.单词拆分
题解:求:dp[s.length],dp长度是n+1,存放boolean值1)定义dp数组:dp[i]:长度为 i 的 s[0:i-1] 子串是否能拆分成单词,是一个 Boolean 值。2)初始化及basecase:初始化 dp[0]=True 空字符可以被表示3)状态转移:s[0:i] 子串的 dp[i+1] 是否为真(是否可拆分成单词),取决于两点:它的前缀子串 s[0:j-1] 的 dp[j] ,是否为真。剩余子串 s[j:i],是否是一个独立的单词。solution:clas.原创 2020-11-01 16:49:31 · 170 阅读 · 0 评论 -
143. 重排链表||链表求中间节点、反转、合并
题解:1、利用快慢指针寻找链表的中间节点 8762、反转链表 206(环形链表141)3、链表合并solution:class Solution { public void reorderList(ListNode head) { if(head==null) return; ListNode mid=middleNode(head); ListNode l1=head; ListNode l2=mid.next; .原创 2020-10-20 09:06:06 · 83 阅读 · 0 评论 -
寻找链表的倒数第n个节点
两次遍历从头到尾统计节点个数,从而计算出倒数第n个是正数第几个,二次遍历得到。双指针一次遍历快慢指针,快指针先前进n个节点,之后一起前进直到快指针.next为null,此时慢指针所指的节点就是要找的。队列创建一个长度为n的队列,遍历链表逐一进入队列,队列满时继续进行出入队操作,当链表全部遍历完毕时,队尾的元素就是倒数第n个节点。19. 删除链表的倒数第N个节点给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3-..原创 2020-10-20 00:10:54 · 572 阅读 · 0 评论 -
0-1背包问题 || 416 分割等和子集
0-1背包问题的思路1)状态:背包容量、可选择的物品2)选择:装或者不装3)定义dp数组:dp[i][j]=x,前i个物品,容量为j时的背包。x为true/false4)初始化:在没有任何物品装入时的合法状态要求恰好装满:dp[i][0]只有容量为0的背包才能满足没有要求恰好装满:dp[0][i]即没有任何物品放入base case:dp[i][0]=ture装满dp[0][i]=false没有物品5)状态转移方程:(角度:分类讨论)不把这第i个物品装入背包,那么是否能够恰好装满原创 2020-10-12 20:46:54 · 171 阅读 · 0 评论 -
贪心 动规||跳跃游戏45、55
55. 跳跃游戏给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例 2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。题解原创 2020-10-11 15:50:45 · 48 阅读 · 0 评论 -
动规初解||最大子序和 最长上升子序列53、128
53. 最大子序和给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。题解:1、贪心ans为数组首元素,sum初始化为0,遍历nums,若sum>0保留,并更新(对子序列和有增益效果),若sum<=0(对子序列和无增益效果),舍弃并且令其为当前遍历到的nums[i]ans=-2 sum=0 ,ans原创 2020-10-08 22:45:42 · 72 阅读 · 0 评论 -
Binary Tree递归||二叉树展开为链表 530. 二叉搜索树的最小绝对差
114. 二叉树展开为链表给定一个二叉树,原地将它展开为一个单链表。例如,给定二叉树将其展开为:题解:把右子树放到左子树最后一个人节点的右子树中左子树置空solution:class Solution { public void flatten(TreeNode root) { if (root == null) return; if (root.left != null) { TreeNode last = root.le原创 2020-10-06 19:39:38 · 74 阅读 · 0 评论 -
双指针||有序数组去重 排序链表移除元素 26、27、83
26. 删除排序数组中的重复项给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度原创 2020-10-06 19:23:58 · 129 阅读 · 0 评论 -
TopK
347. 前 K 个高频元素给定一个非空的整数数组,返回其中出现频率前 k 高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]提示:你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。你可以按任意顺原创 2020-09-07 23:36:55 · 120 阅读 · 0 评论 -
Binarytree练习二叉树层序遍历 || 用队列实现层序遍历
107. 二叉树的层次遍历 II给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7],返回其自底向上的层次遍历为:[[15,7],[9,20],[3]]队列class Solution { public List<List<Integer>> levelOrderBottom(TreeNode root) { Linke原创 2020-09-06 08:56:25 · 138 阅读 · 0 评论 -
双指针 同向双指针、滑动窗口3、594、|27、26、80、83、82、611、187、643、674、209、438、567、424、76、30
3. 无重复字符的最长子串给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,原创 2020-08-29 18:51:48 · 91 阅读 · 0 评论 -
回溯 全排列 第k个排列 优美的排列 组合 组合总和 N皇后I II
回溯核心:递归前做选择,递归后撤销46. 全排列给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]class Solution { List<List<Integer>> res = new LinkedList<>(); public List<List<Integer>&原创 2020-09-03 11:21:50 · 166 阅读 · 0 评论 -
图 钥匙和房间
841. 钥匙和房间有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,…,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,…,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。最初,除 0 号房间外的其余所有房间都被锁住。你可以自由地在房间之间来回走动。如果能进入每个房间原创 2020-08-31 22:06:14 · 77 阅读 · 0 评论 -
字符串的反转练习 344、541、557、151
557. 反转字符串中的单词 III给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例:输入:“Let’s take LeetCode contest”输出:“s’teL ekat edoCteeL tsetnoc”class Solution { public String reverseWords(String s) { String[] strs=s.split(" "); StringBuffer buffer = new S原创 2020-08-30 13:04:28 · 238 阅读 · 0 评论 -
HashTable哈希表与统计594、350、|554、609、454、18
594. 最长和谐子序列和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。示例 1:输入: [1,3,2,2,5,2,3,7]输出: 5原因: 最长的和谐数组是:[3,2,2,2,3]....原创 2020-08-29 10:01:49 · 110 阅读 · 0 评论 -
双指针头尾指针 167、|345、680、15、16、18、11、42
167. 两数之和 II - 输入有序数组给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = [2, 7, 11, 15], target = 9输出: [1,2]解释: 2 与 7 之和等于目标数原创 2020-08-20 11:16:40 · 143 阅读 · 0 评论 -
HashTable哈希表与索引1、599、219
1. 两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]题解:1)暴力 双重循环2)hashsloution:class Solution { public int原创 2020-08-19 20:37:12 · 129 阅读 · 0 评论 -
链表 环形链表 链表判环 寻找入环节点141、142
141. 环形链表给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。示例 2:输入:head = [1,2], pos = 0输出:true解释:链表中有一个环,其尾部连接到第一个节点。示例 3:输入:head = [1], pos原创 2020-08-14 22:13:00 · 120 阅读 · 0 评论 -
双指针快慢指针||快乐数、寻找重复数202、287、|141、142、143、234、457
202. 快乐数编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 True ;不是,则返回 False 。示例:输入:19输出:true解释:12 + 92 = 8282 + 22 = 6862 + 82 = 10012 + 02 + 02 = 1题解:1)暴力2)原创 2020-08-14 11:23:55 · 150 阅读 · 0 评论 -
BinaryTree练习 从前序与中序、中序与后序遍历序列构造二叉树||重构二叉树654、105、106
105. 从前序与中序遍历序列构造二叉树根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:题解:1)前/后+中 确定唯一的二叉树2)前序遍历第一个元素为root3)找到中序遍历中root,左边为左子树右边为右子树4)递归sloution:简洁版:class Solution { public TreeN原创 2020-08-13 10:36:26 · 103 阅读 · 0 评论 -
HashTable哈希表练习查找插入删除217、349 、202、287、290、532、205、128
底层实现HashSet是通过HasMap来实现的,HashMap的输入参数有Key、Value两个组成,在实现HashSet的时候,保持HashMap的Value为常量,相当于在HashMap中只对Key对象进行处理。HashMap的底层是一个数组结构,数组中的每一项对应了一个链表,这种结构称“链表散列”的数据结构,即数组和链表的结合体;也叫散列表、哈希表。217. 存在重复元素给定一个整数数组,判断是否存在重复元素。如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元原创 2020-08-12 20:36:13 · 173 阅读 · 0 评论 -
Binarytree练习二叉树序列化反序列化606、331、652、297
606. 根据二叉树创建字符串你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。题解:左子树为空时用()替代节点,如果右子树为空或者左右子树都为空不用。参考sloution:class Solution { //前序遍历 TreeNode pre = null; public String tree2str(TreeNode t) {原创 2020-08-08 15:31:54 · 164 阅读 · 0 评论 -
Binary Tree练习二叉树遍历递归257、100、222、101、226、437、563、617、572、543、|687
树与递归100. 相同的树给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。题解:递归 需要判断的三种1、都为空、相同2、一个空、一个非空,不同3、都不为空但val不同class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if(p==null&&q==null) return true;原创 2020-08-07 09:09:27 · 144 阅读 · 0 评论