1. 算法刷题实战LeetCode Hot 1001-10精解算法刷题是每个程序员进阶的必经之路而LeetCode Hot 100则是其中最经典的题目集合。今天我将分享前10道高频题目的解题思路和Java实现重点解析哈希表、双指针和滑动窗口这三大核心技巧。1.1 两数之和哈希表的经典应用两数之和Two Sum是算法入门的第一道题目但它的解法却体现了哈希表的核心思想。题目要求找出数组中两个数使它们的和等于目标值。class Solution { public int[] twoSum(int[] nums, int target) { MapInteger,Integer mapnew HashMap(); for(int i0;inums.length;i){ if(map.containsKey(target-nums[i])) return new int[]{map.get(target-nums[i]),i}; map.put(nums[i],i); } return new int[]{}; } }关键点解析使用HashMap存储数值, 索引的映射关系遍历时检查target-nums[i]是否存在于map中时间复杂度O(n)空间复杂度O(n)注意不要先填充整个哈希表再遍历这样无法处理重复元素的情况。正确的做法是边遍历边检查。1.2 字母异位词分组哈希表的灵活运用字母异位词Group Anagrams问题需要将字母相同但排列不同的字符串归为一组。class Solution { public ListListString groupAnagrams(String[] strs) { MapString,ListString mapnew HashMap(); for(String str:strs){ char[] cstr.toCharArray(); Arrays.sort(c); String keynew String(c); if(!map.containsKey(key)){ map.put(key,new ArrayList()); } map.get(key).add(str); } return new ArrayList(map.values()); } }优化技巧使用排序后的字符串作为哈希键对于大规模数据可以用字符计数数组作为键效率更高时间复杂度O(nklogk)其中k是最长字符串长度1.3 最长连续序列哈希集合的巧妙使用最长连续序列Longest Consecutive Sequence问题要求在未排序数组中找到最长连续数字序列的长度。class Solution { public int longestConsecutive(int[] nums) { SetInteger setnew HashSet(); for(int num:nums) set.add(num); int max0; for(int num:set){ if(!set.contains(num-1)){ // 确保是序列起点 int currentnum; int count1; while(set.contains(current1)){ current; count; } maxMath.max(max,count); } } return max; } }算法分析使用HashSet去重并实现O(1)查询只从序列起点开始计算避免重复工作时间复杂度O(n)每个元素最多被访问两次2. 双指针技巧的多样应用双指针是解决数组/字符串问题的利器下面几道题展示了它的不同应用场景。2.1 移动零快慢指针的经典案例移动零Move Zeroes要求将所有0移动到数组末尾同时保持非零元素的相对顺序。class Solution { public void moveZeroes(int[] nums) { int slow0; for(int fast0;fastnums.length;fast){ if(nums[fast]!0){ int tempnums[slow]; nums[slow]nums[fast]; nums[fast]temp; slow; } } } }操作要点slow指针指向下一个非零元素应该放置的位置fast指针寻找非零元素交换而非直接赋值可以保持原始数据2.2 盛水最多的容器左右指针的贪心策略盛水最多的容器Container With Most Water需要找到两条线使它们与x轴构成的容器能盛最多水。class Solution { public int maxArea(int[] height) { int left0, rightheight.length-1; int max0; while(leftright){ int area(right-left)*Math.min(height[left],height[right]); maxMath.max(max,area); if(height[left]height[right]){ left; }else{ right--; } } return max; } }为什么移动较矮的一边因为容器的容量由较矮的一边决定移动高的一边不会增加容量而移动矮的一边有可能找到更高的边界。2.3 三数之和排序双指针的完美结合三数之和3Sum要求在数组中找到所有不重复的三元组使其和为0。class Solution { public ListListInteger threeSum(int[] nums) { ListListInteger resnew ArrayList(); Arrays.sort(nums); for(int i0;inums.length-2;i){ if(i0nums[i]nums[i-1]) continue; // 去重 int lefti1, rightnums.length-1; while(leftright){ int sumnums[i]nums[left]nums[right]; if(sum0){ res.add(Arrays.asList(nums[i],nums[left],nums[right])); while(leftrightnums[left]nums[left1]) left; // 去重 while(leftrightnums[right]nums[right-1]) right--; // 去重 left; right--; }else if(sum0){ left; }else{ right--; } } } return res; } }关键细节必须先排序才能使用双指针需要仔细处理重复元素的情况时间复杂度O(n²)空间复杂度O(1)3. 滑动窗口与动态规划3.1 无重复字符的最长子串滑动窗口的典型应用无重复字符的最长子串Longest Substring Without Repeating Characters需要找到不包含重复字符的最长子串。class Solution { public int lengthOfLongestSubstring(String s) { MapCharacter,Integer mapnew HashMap(); int max0, left0; for(int right0;rights.length();right){ char cs.charAt(right); if(map.containsKey(c)){ leftMath.max(left,map.get(c)1); } map.put(c,right); maxMath.max(max,right-left1); } return max; } }窗口维护策略使用HashMap记录字符最后出现的位置当遇到重复字符时调整窗口左边界时间复杂度O(n)空间复杂度O(min(m,n))m是字符集大小3.2 找到字符串中所有字母异位词固定大小的滑动窗口找到字符串中所有字母异位词Find All Anagrams in a String需要在字符串s中找到所有p的字母异位词的起始索引。class Solution { public ListInteger findAnagrams(String s, String p) { ListInteger resnew ArrayList(); if(s.length()p.length()) return res; int[] countnew int[26]; for(char c:p.toCharArray()) count[c-a]; int left0, right0, diffp.length(); for(;rightp.length();right){ char cs.charAt(right); if(count[c-a]0) diff--; count[c-a]--; } if(diff0) res.add(0); for(;rights.length();right,left){ char cs.charAt(left); if(count[c-a]0) diff; count[c-a]; cs.charAt(right); if(count[c-a]0) diff--; count[c-a]--; if(diff0) res.add(left1); } return res; } }优化技巧使用固定大小的滑动窗口长度等于p的长度通过字符计数数组来跟踪匹配情况时间复杂度O(n)空间复杂度O(1)3.3 和为K的子数组前缀和与哈希表和为K的子数组Subarray Sum Equals K需要找到所有连续子数组其和等于k。class Solution { public int subarraySum(int[] nums, int k) { MapInteger,Integer mapnew HashMap(); map.put(0,1); int sum0, count0; for(int num:nums){ sumnum; if(map.containsKey(sum-k)){ countmap.get(sum-k); } map.put(sum,map.getOrDefault(sum,0)1); } return count; } }前缀和原理sum[i,j] sum[0,j] - sum[0,i-1]使用HashMap记录前缀和出现的次数时间复杂度O(n)空间复杂度O(n)4. 高级数据结构应用4.1 滑动窗口最大值双端队列的妙用滑动窗口最大值Sliding Window Maximum需要在每个大小为k的滑动窗口中找到最大值。class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(numsnull||nums.length0) return new int[0]; int[] resnew int[nums.length-k1]; DequeInteger dequenew ArrayDeque(); for(int i0;inums.length;i){ // 移除超出窗口范围的元素 while(!deque.isEmpty()deque.peekFirst()i-k1){ deque.pollFirst(); } // 移除小于当前元素的元素 while(!deque.isEmpty()nums[deque.peekLast()]nums[i]){ deque.pollLast(); } deque.offerLast(i); if(ik-1){ res[i-k1]nums[deque.peekFirst()]; } } return res; } }双端队列策略队列中存储的是索引而非值队列中的元素按从大到小排列时间复杂度O(n)每个元素最多进出队列一次5. 算法刷题经验分享在实际刷题过程中我总结了以下几点经验理解比记忆更重要不要死记硬背解法要理解每个算法背后的思想分类练习按算法类型集中练习比如一周专攻双指针问题反复练习经典题目要多次练习直到能独立写出无bug的代码分析复杂度对每个解法都要能分析时间和空间复杂度边界条件特别注意空输入、极端值等边界情况对于Java开发者还需要注意合理使用集合框架HashMap, HashSet, Deque等注意数组越界和空指针异常字符串操作要小心性能问题如频繁拼接最后提醒算法能力的提升需要时间和耐心建议每天坚持做2-3题长期积累会有显著进步。
企业数字化 ERP 产品动态
相关推荐
VSCode通用包安装避坑指南:架构、扩展与团队分发 简介:这份资源是面向 macOS 开发者的 Visual Studio Code 完整安装包,采用 darwin-universal 通用构建,可同时运行于 Intel 与 Apple Silicon(M1 等)芯片的 Mac,解决跨架构环境下编辑器安装与兼容问题&… · 2026/11/6 4:01:24
JavaWeb图书馆管理系统源码解析:Servlet+JSP+MySQL实战与二次开发 简介:这份资源是面向Java Web初学者与课程设计者的图书馆管理系统完整源码包,基于Servlet、JSP与JavaBean技术栈,配合MySQL数据库实现图书信息、读者账户与借阅记录的管理,适合用于毕业设计参考、框架入门练习或二次开发。压缩包共… · 2026/11/6 4:01:24
2026年软考中级软件设计师备考全攻略 1. 备考软件设计师(中级)的核心价值与挑战软考中级软件设计师证书是行业内公认的技术能力"硬通货"。我2018年备考时发现,这个认证不仅考察编码能力,更注重软件工程全流程的体系化思维。2026年考纲虽然会有微调ÿ… · 2026/11/6 4:01:24
电工证值不值得考?学历不高也能报!等级电工证怎么考怎么用 电工证值不值得考?学历不高也能报!等级电工证怎么考怎么用 你是不是也担心自己学历不高,考不了等级电工证?其实不然,只要你能通过实际操作和理论考试, 等级电工证 一样可以顺利拿到手。今天我们就来聊聊, 等级电工证值不值得考… · 2026/11/7 4:59:56
电工证花钱怎么复审千万别踩坑 新乡应届生避坑指南 电工证花钱怎么复审千万别踩坑 新乡应届生避坑指南 学历不高怕报不上名,特别是新乡应届工程类毕业生,刚毕业就想着考个电工证,但听说复审还要花钱,担心自己不懂流程、怕被坑,这种心理很正常。其实,只要找对方法,复审并不难,关键是要避开那些不靠谱的… · 2026/11/7 4:59:56
工地临电什么电工证考前押题攻略与资格互认问题全解析 工地临电什么电工证考前押题攻略与资格互认问题全解析 之前考的证在外省能不能转过来?这个问题在河南、河北、山东等地的工地上,几乎是每个特种作业人员都会问的。尤其是像工地临电这样的岗位, 工地临电什么电工证… · 2026/11/7 4:59:56
成都电工证分哪几种官方回应来了 不要再被中介骗 成都电工证分哪几种官方回应来了 不要再被中介骗 不知道去哪报名怕被中介坑?成都电工证分哪几种?这事儿官方早有回应,别再被那些“包过”“包办”的中介忽悠了。今天咱们就从 成都电工证分哪几种… · 2026/11/7 4:59:56
宿州哪里可以办电工证 低学历也能考电子证书 宿州哪里可以办电工证 低学历也能考电子证书 你是不是也担心自己学历不高,考个电工证都报不上名?别急,宿州哪里可以办电工证,其实一点都不难。只要找对地方,准备好材料,就能顺利拿到 电子证书… · 2026/11/7 4:59:56
考电工证哪里领补助钱怎么考 电工证哪里领补助钱?真实经历告诉你别被中介坑 你是不是也这样,看到电工证能领补助钱,心里痒痒,但又怕被中介坑?别急,这年头,考个证确实不容易,但只要走对路,别被那些“包过”“包拿证”“包补助”的话忽悠住,一切都没问题。我有个老同事,是信阳浉… · 2026/11/7 4:58:56
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23
澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 证书过期了不知道怎么复审延期?别慌,很多人在拿到【澳洲水电工证考试】的电子证书后,一不小心就忽略了复审时间,结果证书失效,工作受阻,甚至被单位追责。今天就从【澳洲水电工证考试… · 2026/11/7 0:00:41
电工作业提示版通过率揭秘:怎么考才能一次过? 电工作业提示版通过率揭秘:怎么考才能一次过? 怕考不过白交培训费?别急,今天我就从驻马店应届工程类毕业生的视角,带你全面了解电工作业提示版的考试流程、备考要点和真实通过率,帮你少走弯路、提高一次通过率。… · 2026/11/7 0:00:41
电工证年审报名千万别踩坑 外省证转过来要搞清这几点 电工证年审报名千万别踩坑 外省证转过来要搞清这几点 之前考的证在外省能不能转过来?这个问题是很多电工从业者最关心的,特别是像你这样在商丘从事公路工程的人员,经常需要跨省流动,证书的 有效性 和 可迁移性… · 2026/11/7 0:00:41
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23