题1 无重复字符的最长子串

描述

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

方法1 暴力破解

思路:定义allUnique方法,查看字符串s的每个子串,是否存在相同的字符,用start和end记录子串的位置。对于s串用两层for循环依次访问所有子串,用result记录结果,即不含相同字符的子串中最长的子串的长度。

这种方法对于过长的字符串s会导致时间过长,无法通过,算法的时间复杂度为O(n3)O(n^3)O(n3)

class Solution {public boolean allUnique(String s, int start, int end){Set<Character> set = new HashSet<>();for (int i = start; i < end; i++){Character c = s.charAt(i);if(set.contains(c)) return false;set.add(c);}return true;}public int lengthOfLongestSubstring(String s) {int result = 0;for(int i = 0; i < s.length(); i++){for(int j = i+1; j <= s.length(); j++){if(allUnique(s,i,j))result = Math.max(result, j-i);}}return result;}
}

方法2 滑动窗口-HashSet

思路:我们使用 HashSet 将字符存储在当前窗口[i,j)[i, j)[i,j)中。 然后我们向右侧滑动索引jjj,如果它不在 HashSet 中,我们会继续滑动jjj。直到s[j]s[j]s[j]已经存在于 HashSet 中。此时,我们找到的没有重复字符的最长子字符串将会以索引iii开头,更换iii对应的字符,得到新iii对应的子串,重复上述操作。如果我们对所有的iii这样做,就可以得到答案。算法的时间复杂度为O(n)O(n)O(n)

class Solution {public int lengthOfLongestSubstring(String s) {int i = 0, j = 0;int len = s.length();int result = 0;Set<Character> set = new HashSet<>();while(i < len && j < len){if(!set.contains(s.charAt(j))){set.add(s.charAt(j++));result = Math.max(j-i,result);}else{set.remove(s.charAt(i++));}}return result;}
}

方法3 滑动窗口优化法-HashMap

思路:我们可以定义字符到索引的映射,而不是使用集合来判断一个字符是否存在。 当我们找到重复的字符时,我们可以立即跳过该窗口。也就是说,如果s[j]s[j]s[j]在[i,j)[i, j)[i,j)范围内有与j′j'j′重复的字符,我们不需要逐渐增加iii。 我们可以直接跳过[i,j′][i, j'][i,j′]范围内的所有元素,并将iii变为j′+1j'+1j′+1。

class Solution {public int lengthOfLongestSubstring(String s) {int len = s.length();int result = 0;Map<Character, Integer> map = new HashMap<>();for(int i = 0, j = 0; j < len ; j ++){if(map.containsKey(s.charAt(j))){i = Math.max(i, map.get(s.charAt(j)));}result = Math.max(j - i + 1, result);map.put(s.charAt(j), j + 1); }return result;}
}

笔记

  1. 定义集合 Set set = new HashSet<>();
  2. 集合添加元素:set.add©
  3. 判断元素是否再集合中:set.contains©

题2 合并两个有序链表

描述

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

方法1 迭代法

思路:首先,我们设定一个哨兵节点 “prehead” ,这可以在最后让我们比较容易地返回合并后的链表。我们维护一个 prev 指针,我们需要做的是调整它的 next 指针。然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :如果 l1 当前位置的值小于等于 l2 ,我们就把 l1 的值接在 prev 节点的后面同时将 l1 指针往后移一个。否则,我们对 l2 做同样的操作。不管我们将哪一个元素接在了后面,我们都把 prev 向后移一个元素。在循环终止的时候, l1 和 l2 至多有一个是非空的。由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution {public ListNode mergeTwoLists(ListNode l1, ListNode l2) {ListNode prehead = new ListNode(-1);ListNode prev = prehead; //prehead指向prevwhile(l1 != null && l2 != null){if(l1.val <= l2.val){prev.next = l1; // 指向较小的元素l1 = l1.next; //指向下一个元素}else{prev.next = l2;l2 = l2.next;}prev = prev.next;}prev.next = l1 == null ? l2:l1;//剩余的一次性附加再prev末尾return prehead.next;}
}

方法2 递归法

思路:两个链表头部较小的一个与剩下元素的 merge 操作结果合并。我们直接将以上递归过程建模,首先考虑边界情况。特殊的,如果 l1 或者 l2 一开始就是 null ,那么没有任何操作需要合并,所以我们只需要返回非空链表。否则,我们要判断 l1 和 l2 哪一个的头元素更小,然后递归地决定下一个添加到结果里的值。如果两个链表都是空的,那么过程终止,所以递归过程最终一定会终止。

class Solution {public ListNode mergeTwoLists(ListNode l1, ListNode l2) {if (l1 == null) {return l2;}else if (l2 == null) {return l1;}else if (l1.val < l2.val) {l1.next = mergeTwoLists(l1.next, l2);return l1;}else {l2.next = mergeTwoLists(l1, l2.next);return l2;}}
}

参考链接:
https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode/
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/wu-zhong-fu-zi-fu-de-zui-chang-zi-chuan-by-leetcod/
仅供个人学习使用

【LeetCode】3月18日打卡-Day3相关推荐

  1. leetcode.cn 2022年11月4日 打卡题 754. 到达终点数字【一元二次方程解法,时间复杂度O(1)】

    leetcode 2022年11月4日 打卡题 754. 到达终点数字 写在前面   首先感谢 @子不语 大佬发布的一元二次方程代码实现的启发.题解链接:子不语-754. 到达终点数字   本文侧重梳 ...

  2. 互联网晚报 | 2月18日 星期五 | 高途宣布停止高中学科辅导服务;小红书启动最严医美专项治理;FF 91量产版2月23日发布...

    今日看点 ✦ 我国"东数西算"工程正式全面启动,8地建设国家算力枢纽节点 ✦ 华为投资40亿元进入深圳香蜜湖,建设数字能源总部及研发基地 ✦ 中兴通讯:成立汽车电子产品线,布局并开 ...

  3. 互联网日报 | 4月18日 星期日 | 水滴公司递交赴美IPO申请;极狐阿尔法S首发上市;盒马X会员店6月进京...

    今日看点 ✦ 华为商城回应:4月16日起推出不含充电器和数据线手机新版本,售价减少200元 ✦ 荣耀董事长万飚:目标成为世界智能手机前三品牌 ✦ 水滴公司提交赴美IPO申请:2020年营收30.28亿 ...

  4. 神雕侠侣手游服务器维护,《神雕侠侣》2020年6月18日更新维护新服开启公告

    亲爱的玩家: 为了给您提供更好的游戏体验,我们将于2020年6月18日上午8:00-11:00对所有服务器进行停机更新维护,预计维护时间3小时. 若提前完成维护内容,我们将提前开服.对于停机期间给您带 ...

  5. 10月18日~23日 产品

    2017年10月18日 星期三 十九大于今日召开 [起点学院早报] 1. 微信团队通过官方微信号"微信派"发布公告称,近期微信将进行系统维护,即日起至本月底,用户暂时无法修改头像. ...

  6. 【历史上的今天】9 月 18 日:McAfee 创始人出生;ICANN 成立;QQ 宠物正式下线

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 9 月 18 日,回顾科技历史上的今天也是名人辈出的一日:数学家和计算机科学家们留下的宝贵遗产,让今 ...

  7. 【历史上的今天】12 月 18 日:Perl 1.0 诞生;音频制作软件 FL Studio 问世;微软发布 Windows MCE 2003

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 18 日,在 1890 年的今天,无线电发明家埃德温·阿姆斯特朗(Edwin Armstr ...

  8. 【历史上的今天】10 月 18 日:Internet Explorer 7 正式发布;全球首家网络银行开业;“美版红白机” NES 诞生

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 10 月 18 日,在 100 年前的今天,英国 BBC 广播电视台成立:BBC 是世界上最大的新闻 ...

  9. lol8.18服务器不稳定,lol8月18日更新BUG修复一览 8月18日更新修复了哪些BUG

    lol8月18日更新BUG修复一览,8月18日更新修复了哪些BUG?lol英雄联盟在8月18日进行了版本的维护更新,同时也修复了部分的BUG,那么都有哪些BUG呢?下面就和小编一起来看看吧. 8月18 ...

  10. Live Source Address 2019最新的电视广播包_11月18日24日 | 西演LIVE本周演出合集

    西演LIVE 11月18日-11月24日 本周演出合集 Vast&Hazy [往诊]2019巡演 西安站 本次2019年巡演的主题是"往诊",指的是在大型综合医院出现以前的 ...

最新文章

  1. python __call__的作用,是可以将对象作为方法使用的关键 分析nn.Module源码
  2. pycharm 远程调试图文_Pycharm配置远程调试的图文步骤
  3. 实战项目四:爬取911网站
  4. 【NLP】从整体视角了解情感分析、文本分类!
  5. java多线程传值覆盖_Java 多线程传值的四种方法
  6. 『设计模式』HR问了我朋友什么是简单工厂模式,竟被质疑是否学过设计模式,是否是计算机专业?
  7. python第十六课——ascii码
  8. Redis之数据结构和底层编码
  9. tspline工具_Rhino 6 如何使用 T-spline?
  10. android模拟器 权限管理,Android模拟器上未授予权限
  11. SDNU_ACM_ICPC_2020_Winter_Practice_2nd C 离散化, lower_bound
  12. java -jar .jar_Java_JAR命令JAR包闲谈;
  13. 关于Unity中天空盒的使用
  14. 如何搭建企业数据化运营体系?
  15. 解决github.io 连接不安全,无法访问
  16. wifi模块微信小程序AP配网(UDP)
  17. ubuntu安装mysql忘记密码并重置
  18. 大盘是超跌反弹还是彻底反转?
  19. 自动编码器检测检测信用卡欺诈
  20. Django rest framework 返回错误信息 __str__ returned non-string (type NoneType)

热门文章

  1. 【音频】I2S协议时序及使用粗解
  2. 重装/重置系统后,针对于虚拟机需要输入许可证,仍无法打不开问题
  3. .Net Remoting 入门
  4. ANSYS网格转化为模型、ANSYS网格导入到workbench分析
  5. Spring Boot 开发微信公众号后台
  6. 同济大学高数第七版下册对梯度的解释
  7. CANalyzer添加dbc文件
  8. 阿酷三合一版_阿酷插件下载|3dmax阿酷插件下载 v3.2 开源版 - 比克尔下载
  9. android 9.0 c7Pro,三星c7pro和vivo x9哪个好?三星Galaxy c7 pro和vivo x9区别对比评测
  10. C语言根号下ln怎么表示,c语言ln根号x