leetCode热题52-57 解题代码,调试代码和思路

前言

本文属于特定的六道题目题解和调试代码。

1 ✔ [剑指 Offer 22]链表中倒数第k个节点 Easy 2022-09-01 91
2 ✔ [76]最小覆盖子串 Hard 2023-03-27 82
3 ✔ [165]比较版本号 Medium 2023-03-20 80
4 ✔ [105]从前序与中序遍历序列构造二叉树 Medium 2022-10-10 80
5 ✔ [32]最长有效括号 Hard 2023-04-05 79
6 ✔ [151]翻转字符串里的单词 Medium 2023-02-09 79

正所谓磨刀不误砍柴功,下面这几篇文章算是我用idea刷题的经验帖,对涉及的题型,数据结构的快速构建分析和解决很有帮助,这里放个链接仅供参考。

如何调试递归程序,有何技巧?

按照树形结构直观地打印出一棵二叉树、快速创建leetcode中树的结构(Java)


1 ✔ [剑指 Offer 22]链表中倒数第k个节点 Easy 2022-09-01 91

//输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
//
// 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
//
//
//
// 示例:
//
//
//给定一个链表: 1->2->3->4->5, 和 k = 2.
//
//返回链表 4->5.
//
// Related Topics 链表 双指针 👍 447 👎 0


自测代码

public class P剑指Offer22_LianBiaoZhongDaoShuDiKgeJieDianLcof{
   
	 public static void main(String[] args) {
   
	 	 //测试代码
	 	 Solution solution = new P剑指Offer22_LianBiaoZhongDaoShuDiKgeJieDianLcof().new Solution();
	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
   
    public ListNode getKthFromEnd(ListNode head, int k) {
   
		ListNode dummyHead = new ListNode(0, head);
		ListNode l = dummyHead.next;
		ListNode r = dummyHead;

		while (k >= 0){
   
			k--;
			r = r.next;
		}

		while (r != null){
   
			r = r.next;
			l = l.next;
		}

		return l;

	}
}
//leetcode submit region end(Prohibit modification and deletion)

}


提交代码

class Solution {
   
    public ListNode getKthFromEnd(ListNode head, int k) {
   
		ListNode dummyHead = new ListNode(0, head);
		ListNode l = dummyHead.next;
		ListNode r = dummyHead;

		while (k >= 0){
   
			k--;
			r = r.next;
		}

		while (r != null){
   
			r = r.next;
			l = l.next;
		}

		return l;

	}
}

2 ✔ [76]最小覆盖子串 Hard 2023-03-27 82

//给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
//
//
//
// 注意:
//
//
// 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
// 如果 s 中存在这样的子串,我们保证它是唯一的答案。
//
//
//
//
// 示例 1:
//
//
//输入:s = “ADOBECODEBANC”, t = “ABC”
//输出:“BANC”
//解释:最小覆盖子串 “BANC” 包含来自字符串 t 的 ‘A’、‘B’ 和 ‘C’。
//
//
// 示例 2:
//
//
//输入:s = “a”, t = “a”
//输出:“a”
//解释:整个字符串 s 是最小覆盖子串。
//
//
// 示例 3:
//
//
//输入: s = “a”, t = “aa”
//输出: “”
//解释: t 中两个字符 ‘a’ 均应包含在 s 的子串中,
//因此没有符合条件的子字符串,返回空字符串。
//
//
//
// 提示:
//
//
// m == s.length
// n == t.length
// 1 <= m, n <= 10⁵
// s 和 t 由英文字母组成
//
//
//
//进阶:你能设计一个在
//o(m+n) 时间内解决此问题的算法吗?
//
// Related Topics 哈希表 字符串 滑动窗口 👍 2428 👎 0


    /*疑惑点,通过控制两个指针分别缩小s的范围,但是一些特殊情况下,区分不出来,是删除左边好还是删除右边好*/
    /*解决方案:如果两边都可以删除,采用递归将两种情况都遍历出来,但是超时了*/

解决方案2: 在遍历s的时候,每次满足了所有t元素就遍历左指针,并记录最短的结果。

自测代码

public class P76_MinimumWindowSubstring {
   
    public static void main(String[] args) {
   
        //测试代码
        Solution solution = new P76_MinimumWindowSubstring().new Solution();
        System.out.println(solution.minWindow("ADOBECODEBANC", "ABC"));
        /*疑惑点,通过控制两个指针分别缩小s的范围,但是一些特殊情况下,区分不出来,是删除左边好还是删除右边好*/
        /*解决方案:如果两边都可以删除,采用递归将两种情况都遍历出来,但是超时了*/
    }

    //力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
   




        public String minWindow(String s, String t) {
   
            int tLen = t.length();
            HashMap<Character, Integer> data = new HashMap<>();
            for (char c : t.toCharArray()) {
   
                data.put(c, data.getOrDefault(c, 0) + 1);
            }

            LinkedList<Integer> res = new LinkedList<>();

            String resStr = "";
            int resLen = Integer.MAX_VALUE;

            for (int i = 0; i < s.length(); i++) {
   

                char c = s.charAt(i);
                if (data.containsKey(c)) {
   
                    tLen--;
                    res.addLast(i);
                    data.put(c, data.getOrDefault(c, 0) - 1);
                    if (data.get(c) < 0) {
   
                        tLen++;
                    }

                    if (tLen == 0) {
   
                        while (data.get(s.charAt(res.getFirst())) <= 0) {
   

                            if (data.get(s.charAt(res.getFirst())) == 0) {
   
                                if (resLen > res.getLast() - res.getFirst()+1) {
   
                                    resStr =  s.substring(res.getFirst(), res.getLast() + 1);
                                    resLen = res.getLast() - res.getFirst()+1;
                                }
                                break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑白极客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值