topcode【随机算法题】【2026.5.21打卡-java版本】

发布时间:2026/5/22 5:43:37

topcode【随机算法题】【2026.5.21打卡-java版本】 分割回文串要点回溯On)走完三个函数class Solution { public ListListString partition(String s) { ListListString ans new ArrayList(); backtrack(s, ans, 0, new ArrayList()); return ans; } public void backtrack(String s, ListListString ans, int start, ListString path){ if(start s.length()){ ans.add(new ArrayList(path)); return; } for(int end start; end s.length(); end){ if(ishuiwen(s,start,end)){ path.add(s.substring(start,end1)); backtrack(s, ans, end1, path); path.remove(path.size() - 1); } } } public boolean ishuiwen(String s, int left, int right){ while(left right){ if(s.charAt(left) s.charAt(right)){ left; right--; }else{ return false; } } return true; } }寻找旋转排序数组中的最小值要点二分总有一遍是有序的注意mid的情况class Solution { public int findMin(int[] nums) { //二分法 int left 0; int right nums.length - 1; int min Integer.MAX_VALUE; while(left right){ int mid left (right - left)/2; //注意这个等于号 if(nums[left] nums[mid]){ min Math.min(min, nums[left]); left mid1; }else{ min Math.min(min, nums[mid]); right mid -1; } } return min; } }单词搜索要点dfs --上下左右t的index也要传过去class Solution { public boolean exist(char[][] board, String word) { //dfs int n board.length; int m board[0].length; for(int i 0; i n; i){ for(int j 0; j m; j){ if(dfs(word, board, i, j,0)){ return true; } } } return false; } public boolean dfs(String word, char[][] board, int i, int j, int index){ if(index word.length()){ return true; } if(i 0 || i board.length || j 0 || j board[0].length ){ return false; } if(word.charAt(index) ! board[i][j]){ return false; } char temp board[i][j]; board[i][j] #; boolean found dfs(word,board, i1, j, index1) || dfs(word,board, i, j1, index1) || dfs(word,board, i-1, j, index1) || dfs(word,board, i, j-1, index1) ; board[i][j] temp; return found; } }括号生成要点dfs open n, end open,选还是不选这个符号class Solution { public ListString generateParenthesis(int n) { ListString res new ArrayList(); dfs(res, new StringBuilder(), 0, 0, n); return res; } private void dfs(ListString res, StringBuilder sb, int open, int close, int n) { // 终止条件左括号和右括号都用完了得到一个完整组合 if (open n close n) { res.add(sb.toString()); return; } // 选择1放左括号 —— “放进去” if (open n) { sb.append((); // 放进去 dfs(res, sb, open1, close, n); // 递归 sb.deleteCharAt(sb.length()-1); // 出来取消夹心饼干的“取消” } // 选择2放右括号 —— “放进去” if (close open) { // 必须右括号数量小于左括号数量 sb.append()); // 放进去 dfs(res, sb, open, close1, n); // 递归 sb.deleteCharAt(sb.length()-1); // 出来取消 } } }随机知识一、数据结构到底是什么意思简单说数据结构 数据 结构 对数据的操作。数据你要处理的信息比如数字、文字、用户信息。结构这些数据在内存中怎么摆放彼此之间有什么关系。操作在这些数据上能高效地做什么比如查找、插入、删除、排序。比如把书一本本平铺在桌上是一种“结构”把书叠成一摞又是另一种“结构”。你取书的方式完全不同。数据结构就是这个道理在计算机里的体现。二、常见的数据结构有哪些可以分成几大类每类都有最经典的几种1. 线性结构数据像一条线串起来数组连续内存按编号瞬间访问但插入删除很慢。链表数据通过指针连起来插入删除快但查找要一个个找。栈像一摞盘子后进先出常用在函数调用、撤销操作。队列像排队先进先出常用在任务调度、消息处理。2. 树形结构数据有层次像倒长的树二叉树 / 二叉搜索树左小右大查找很快。平衡树如AVL、红黑树能自平衡防止退化成链表。堆最大或最小的在顶上用来做优先队列。B树 / B树磁盘读写友好是数据库索引的基础。3. 图形结构数据之间任意关联图由节点和边组成表示网络关系比如社交网络、地图导航。常用的有邻接矩阵、邻接表等存储方式。4. 散列结构直接映射哈希表通过哈希函数把键直接映射到位置查找非常快是字典、集合的底层。三、数据结构是操作系统存储数据的结构吗不是一回事但两者有关系。数据结构是逻辑层面的、通用的组织方式你写的任何程序小到计算器大到游戏都可以用。它主要关心的是内存里的数据如何高效存取。操作系统存储数据更多是指文件系统比如 NTFS、ext4如何把文件存到磁盘上或者内存管理如何分页、分段。这属于系统层面的“物理存储”或“持久化存储”的布局。不过操作系统内部实现时自身也会大量使用数据结构管理进程用链表、队列就绪队列。管理内存用位图、链表。文件系统的目录结构常用B树来组织。所以你可以理解为数据结构是造所有软件包括操作系统的积木而操作系统存储数据的结构是这些积木在系统底层的一种具体应用。一、各种数据结构的典型应用1. 数组 / 动态数组如 Python list特点内存连续靠下标瞬间访问但中间插入删除很慢。适合什么数据数据个数基本不变需要经常按序号取第N个或顺序遍历例如学生成绩列表、排行榜 Top100、一周天气温度不适用频繁在头部或中间插入删除会让数组反复搬家。2. 链表特点元素散落内存通过指针串起来插入删除非常快但查找要一个一个往下走。适合什么数据经常在任意位置增删元素且不需要随机访问例如音乐播放器的播放列表随时插入/切歌/移除、操作系统的进程队列随时加入新进程、移除已完成进程经典搭配LRU 缓存淘汰算法常用双向链表 哈希表实现。3. 栈后进先出像一摞盘子。适合什么数据需要倒回到上一次状态或撤销例如函数调用栈A 调用 BB 返回后继续 A编辑器的撤销Undo功能括号匹配检查浏览器的后退按钮4. 队列先进先出像排队。适合什么数据需要按顺序处理先到先服务例如打印机任务队列消息队列订单系统处理请求游戏的指令排队执行变种双端队列可两端进出如“回文检查”优先队列按优先级出队。5. 哈希表散列表如字典/对象特点通过键直接计算位置查找、插入、删除都非常快但内部无序。适合什么数据键值对需要根据唯一键快速查值例如手机通讯录姓名 - 号码用户ID查用户信息缓存网址 - 页面内容统计次数单词频率计数注意如果需要按顺序遍历所有键哈希表不合适无序这时可以用树结构或有序字典。6. 树特别是二叉搜索树、平衡树特点数据有序存放左小右大可高效查找、插入、删除并能按顺序遍历。适合什么数据需要动态维护有序数据并常做范围查询如“找出分数在80-90的所有人”例如数据库索引B树/B树文件系统的目录结构自动补全、拼写提示的前缀树Trie组织架构图、HTML DOM 树具体选择内存中的有序映射 → 红黑树、AVL树如C的std::map磁盘上的海量数据索引 →B树/B树让磁盘读写次数最少7. 堆特点快速拿到最大或最小值不是整体有序。适合什么数据反复取“当前最大/最小”的任务例如优先队列急诊病人按病情优先级而非排队顺序定时任务调度最近要执行的任务放在堆顶Dijkstra最短路径算法中选取最近节点找出最大的Top K个元素如热搜Top108. 图特点表示节点间任意连接的网络。适合什么数据事物之间有复杂的多对多关系例如社交网络用户关注关系地图导航道路交叉点最短路径网站链接关系PageRank网络拓扑、课程依赖关系先修课二、一般什么数据用什么结构速查表你的数据特征 / 需求选什么结构固定长度、按编号快速访问数组频繁在两头或中间增删链表最后添加的要最先处理栈最先添加的要最先处理队列按优先级处理堆(优先队列)键值对极速查找不关心顺序哈希表键值对需要按Key排序、范围查找平衡树(如红黑树)大量数据在磁盘需要排序和范围查询B树/B树表示层次、父子关系树表示网状、社交或路径关系图字符串前缀快速查找如搜索提示Trie前缀树既要快速查找又要维护插入顺序链表哈希表如Java LinkedHashMap实际操作中很多高级结构就是这些基础的组合。比如Redis的有序集合就是跳表 哈希表数据库索引是B树。理解“什么场景用什么结构”其实就是在寻找最适合你核心操作的数据组织方式。碎碎念后续会更新每天学习的八股和算法 题开始准备秋招的第11天。努力连续更新100天以后每天就按秋招项目【javaagent】科研必做项目算法八股来总结。1.秋招项目agent还在修改接入前面修改好了但是面试八股这边还没准备好vibe的有点自己都把握不住这不行的。2.科研有点小想法但是不太确定结果怎么样后续还是得做实验验证反正工作量是得堆上去。 3.项目继续搞还差测试集也不确定能不能落地这个得i形成报告要不然不好交差还。4.八股继续深挖吧就是要知道所以然。太久没系统的看一遍了。5.算法感觉刷了老忘记这周尽量第二遍leecode完结把灵神的视频过一遍。【最后最后请相信自己可以的】

相关新闻