当前位置: 首页 > article >正文

Leetcode百题斩-哈希

看来面试前还是要老老实实刷leetcode为好,今天看到一个题库,leetcode百题斩,刚好最近面试的这两题全在里面。瞄了一眼,也有不少题之前居然也刷过。那么,冲冲冲,看多久能把这百题刷完。

第一天,先刷第一个专题哈希。感觉作为一个竞赛生,刷这种题应该没什么难度。那就不用C++了,直接上JAVA

1. Two Sum[Easy]

思路:作为leetcode首题,太经典的哈希表了

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> numMap = new HashMap<>();int len = nums.length;for (int i = 0; i < len; i++) {int complement = target - nums[i];if (numMap.containsKey(complement)) {return new int[] {numMap.get(complement), i};}numMap.put(nums[i], i);}return null;}
}

49. Group Anagrams[Mediam]

思路:异位字母分组,直接将字母排序后进行哈希

class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> groupMap = new HashMap<>();for (String str : strs) {String sortedStr = sortString(str);groupMap.computeIfAbsent(sortedStr, k -> new ArrayList<>()).add(str);}return new ArrayList<>(groupMap.values());}private String sortString(String s) {char[] stringC = s.toCharArray();Arrays.sort(stringC);return new String(stringC);}
}

128. Longest Consecutive Sequence[Medium]

思路:最长连续序列,第一想法就是直接排序,然后进行统计。复杂度为 O(nlogn)。注意特判一下空数组即可

class Solution {public int longestConsecutive(int[] nums) {if (nums == null || nums.length == 0) {return 0;}Arrays.sort(nums);int numLen = nums.length;int curLen = 1;int maxLen = 1;for (int i = 0; i < numLen; i++) {if (i > 0 && nums[i] == nums[i - 1] + 1) {curLen++;if (curLen > maxLen) {maxLen = curLen;}} else if (i == 0 || nums[i] != nums[i - 1]) {curLen = 1;}}return maxLen;}
}

既然这题被分在了哈希专栏里,那么想想是否可以通过哈希的方法将复杂度降到 O(n)。那么排序肯定是排不了了,直接将数组维护在哈希集合中,遍历集合元素,针对每段连续序列的头节点(该数的前一个数不在集合中),向后判断该段连续序列长度

class Solution {public int longestConsecutive(int[] nums) {if (nums == null || nums.length == 0) {return 0;}HashSet<Integer> numSet = new HashSet<>();int maxLen = 1;for (int num : nums) {numSet.add(num);}for (int num : numSet) {if (!numSet.contains(num - 1)) {int curlen = 1;while (numSet.contains(num + curlen)) {curlen++;}if (curlen > maxLen) {maxLen = curlen;}}}return maxLen;}
}

不过虽然这个算法将复杂度降下来了,但是最终的耗时其实还不如排序,可见现在的排序优化已经十分到位了。

560. Subarray Sum Equals K[medium]

思路:求数串中和为k的子串。想到子串问题,当然就想到了前缀和。两个前缀和的差值即为一个子串和。因此,哈希表维护一下前缀和及对应数量。由于 sum(current)-sum(need)=k,因此只需要遍历前缀和,寻找哈希表中 sum-k 对应的数量即可

class Solution {public int subarraySum(int[] nums, int k) {Map<Integer, Integer> sumMap = new HashMap<>();int count = 0;int sum = 0;sumMap.put(0, 1);for (int num : nums) {sum += num;int need = sum - k;if (sumMap.containsKey(need)) {count += sumMap.get(need);}sumMap.put(sum, sumMap.getOrDefault(sum, 0) + 1);}return count;}
}

http://www.lryc.cn/news/2383382.html

相关文章:

  • MySQL替换瀚高数据库报错: TO_DAYS()不存在(APP)
  • EXIST与JOIN连表比较
  • 【Linux】利用多路转接epoll机制、ET模式,基于Reactor设计模式实现
  • 【jvm第7集】jvm调优工具(命令行工具)
  • react中运行 npm run dev 报错,提示vite.config.js出现错误 @esbuild/win32-x64
  • 鸿蒙UI开发——Builder与LocalBuilder对比
  • 关于光谱相机的灵敏度
  • Model 速通系列(一)nanoGPT
  • 微信小程序中,一个页面的数据改变了,怎么通知另一个页面也改变?
  • MySQL--day4--排序与分页
  • 自动化测试脚本点击运行后,打开Chrome很久??
  • iOS热更新技术要点与风险分析
  • 系统架构设计(十二):统一过程模型(RUP)
  • 系分论文《论软件系统安全分析和应用》
  • Mac安装redis
  • srs-7.0 支持obs推webrtc流
  • Babylon.js学习之路《七、用户交互:鼠标点击、拖拽与射线检测》
  • 星际争霸小程序:用Java实现策略模式的星际大战
  • 请问交换机和路由器的区别?vlan 和 VPN 是什么?
  • BERT 作为Transformer的Encoder 为什么采用可学习的位置编码
  • Python数据可视化高级实战之一——绘制GE矩阵图
  • StreamSaver实现大文件下载解决方案
  • 【Vue 3全栈实战】从响应式原理到企业级架构设计
  • Java线程池调优与实践经验
  • 【科研项目】大三保研人科研经历提升
  • 期刊采编系统安装升级错误
  • CSS【详解】弹性布局 flex
  • 自回归图像编辑 EditAR: Unified Conditional Generation with Autoregressive Models
  • React Flow 中 Minimap 与 Controls 组件使用指南:交互式小地图与视口控制定制(含代码示例)
  • 基于YOLOv8 的分类道路目标系统-PyTorch实现