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

LeetCode Hot 100 第一天

1. 1.两数之和

链接:题目链接
题解

要求时间复杂度小于O(n^2)。知道x、target,那么 y = target - x,肯定需要枚举x,如果通过O(1)的时间复杂度找到y的位置,那么整体时间复杂度就在O(n),通过O(1)时间复杂度不可避免的想到HashMap,其中key存y值,value存y的位置,那么通过Hash快速找到需要的值。

代码

public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> numberIndexMap = new HashMap<>();int len = nums.length;int l = 0, r = 0;for (int i = 0; i < len; ++ i) {int preNum = target - nums[i];// 答案元素 肯定一前一后,所以边遍历边找前面的元素就行了,肯定能覆盖整个集合Integer index = numberIndexMap.get(preNum);if (index != null) {l = index;r = i;break;}numberIndexMap.put(nums[i], i);}return new int[]{l, r};}

1. 49 字母异味词分组

链接:题目链接
题解

其实就是把不同的字符串(相同字符数),根据某种规则转换为同一个字符串,那么就可以进行分组了,选用HashMap存储转换后的字符串与原字符串,key为转换后的字符串,value为原字符串集合。这个规则有两种方式,1. 对字符串的字符进行排序 2. 对字符串的字符进行计数,按照abcd…规律 + 计数生成新的字符串

代码

// 规则1
public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> stringListMap = new HashMap<>();for (String str : strs) {// 排序char[] charArray = str.toCharArray();Arrays.sort(charArray);List<String> sortStrs = stringListMap.computeIfAbsent(new String(charArray), key -> new ArrayList<>());sortStrs.add(str);}return new ArrayList<>(stringListMap.values());}// 规则2
public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> sortStrMap = new HashMap<>();int[] counts = new int[26];int len = strs.length;for (int i = 0; i < len; ++ i) {Arrays.fill(counts, 0);int strLen = strs[i].length();for (int j = 0; j < strLen; ++ j) {counts[(int)(strs[i].charAt(j) - 'a')] ++;}// 生成规则StringBuilder strKey = new StringBuilder();for (int j = 0; j < 26; ++ j) {if (counts[j] != 0) {strKey.append('a' + j);strKey.append(counts[j]);}}List<String> sameStrs = sortStrMap.computeIfAbsent(strKey.toString(), k -> new ArrayList<>());sameStrs.add(strs[i]);}return new ArrayList<>(sortStrMap.values());}

3. 128.最长连续序列

链接:题目链接
题解

方案1:要求时间复杂度为O(n),显而易见我们遍历整个集合,到x元素时,假设x为连续列表的起点,那么直接枚举是否存在x+1、x+2、x+3…等元素即可,同时维护一个最大值MaxValue,但是此时会发现假设x+1元素为连续列表的起点时,那么就会出现无效枚举,因为x为连续列表起点时包含了x+1的情况。所以要排除掉x+1、x+2、x+3…的枚举,有一个共同点,那就是存在前元素。
方案2:可以维护连续区间,把每个数字看成一个节点,枚举x为连续列表的起点,如果x+1也在数组中,那么将x、x+1 union在一起,并且维护区间最大值,最后统计联通块的最大值,这里可以用到并查集来进行维护区间。

代码

// 方案1public int longestConsecutive(int[] nums) {Set<Integer> numExistSet = new HashSet<>();for (int num: nums) {numExistSet.add(num);}int result = 0;// 这里需要遍历numExistSet,过滤掉重复元素,如果遍历nums,leetcode会超时for (int num: numExistSet) {if (numExistSet.contains(num - 1)) {continue;}int maxCount = 1;int maxInterval = num + 1;while (numExistSet.contains(maxInterval)) {maxCount += 1;maxInterval += 1;}result = Math.max(maxCount, result);}return result;}// 方案2 
private Map<Integer, Integer> parentMap = new HashMap<>();private Map<Integer, Integer> sizeMap = new HashMap<>();public int find(int x) {if (parentMap.get(x) != x) {parentMap.put(x, find(parentMap.get(x)));}return parentMap.get(x);}public void union(int x, int y) {int parentX = find(x);int parentY = find(y);if (parentX == parentY) {return;}// 将maxValue维护在父节点上if (sizeMap.get(parentX) < sizeMap.get(parentY)) {parentMap.put(parentX, parentY);sizeMap.put(parentY, sizeMap.get(parentY) + sizeMap.get(parentX));} else {parentMap.put(parentY, parentX);sizeMap.put(parentX, sizeMap.get(parentY) + sizeMap.get(parentX)); }}public int longestConsecutive(int[] nums) {// 初始化for (int num: nums) {parentMap.put(num, num);sizeMap.put(num, 1);}// 区间连接for (int num: nums) {if (parentMap.containsKey(num + 1)) {union(num, num + 1);}}// 求最大值int result = 0;for (int num: nums) {if (parentMap.get(num) == num) {result = Math.max(result, sizeMap.get(num));}}return result;}

如果对你有帮助,辛苦点个赞,谢谢啦,朋友!!!

http://www.xdnf.cn/news/1343791.html

相关文章:

  • 相机曝光调节与自动曝光控制详解
  • AI适老服务暖人心:AI适老机顶盒破数字鸿沟、毫米波雷达护独居安全,银发生活新保障
  • 初识数据结构——Map和Set:哈希表与二叉搜索树的魔法对决
  • 车载以太网SOME/IP协议:面向服务的汽车通信技术详解
  • python-对图片中的人体换背景色
  • Java面试宝典:Redis底层原理(持久化+分布式锁)
  • 机器学习-线性回归
  • [react] class Component and function Component
  • vsCode或Cursor 使用remote-ssh插件链接远程终端
  • 用户登录Token缓存Redis实践:提升SpringBoot应用性能
  • yggjs_rlayout使用教程 v0.1.0
  • unistd.h 常用函数速查表
  • 【Linux仓库】进程的“夺舍”与“飞升”:exec 驱动的应用现代化部署流水线
  • Elasticsearch倒排索引和排序
  • Elasticsearch核心概念
  • 【机器学习深度学习】大模型分布式推理概述:从显存困境到高并发挑战的解决方案
  • 用sftp协议实现对文件的上传下载
  • 高压、高功率时代,飞机电气系统如何保障安全?
  • PDF文档安全升级:三招实现文本转曲线(防篡改+高清输出)
  • 一分钟docker部署onlyoffice 在线预览word pdf excel...
  • 嵌入式第三十五天(网络编程)
  • week3-[二维数组]最大列
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析9
  • Windows应急响应一般思路(二)
  • 【基础算法】离散化
  • 驱动(二)uboot编译+内核编译+文件系统
  • AI 绘画争议背后:版权归属、艺术原创性与技术美学的三方博弈
  • 排序---插入排序
  • Oracle APEX 经典报表中的Checkbox
  • 使用EasyExcel自定义导出表格