首页 > 其他分享 >最小覆盖子串(哈希表、字符串)、两数之和(数组、哈希表)、二叉树的层序遍历 II(树、广度优先搜索)

最小覆盖子串(哈希表、字符串)、两数之和(数组、哈希表)、二叉树的层序遍历 II(树、广度优先搜索)

时间:2023-04-04 10:03:52浏览次数:37  
标签:end charAt nums int start 二叉树 哈希 new 两数

最小覆盖子串(哈希表、字符串)

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。 **注意:**如果 s 中存在这样的子串,我们保证它是唯一的答案。

示例 1:

输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"

示例 2:

输入:s = "a", t = "a"
输出:"a"

提示:

  • 1 <= s.length, t.length <= 105
  • s 和 t 由英文字母组成

**进阶:**你能设计一个在 o(n) 时间内解决此问题的算法吗? 以下程序实现了这一功能,请你填补空白处内容:

public class Min_Win_Sub {
	public String minWindow(String s, String t) {
		int[] ta = new int[128];
		int[] sa = new int[128];
		int min = Integer.MAX_VALUE;
		String minwin = "";
		for (int i = 0; i < t.length(); i++) {
			ta[t.charAt(i)]++;
		}
		int count = 0;
		int end = 0;
		int start = 0;
		while (end < s.length()) {
			if (ta[s.charAt(end)] != 0) {
				if (sa[s.charAt(end)] < ta[s.charAt(end)]) {
					count++;
				}
				sa[s.charAt(end)]++;
			}
			if (count == t.length()) {
				_________________;
				if (end - start + 1 < min) {
					minwin = s.substring(start, end + 1);
					min = end - start + 1;
				}
			}
			end++;
		}
		return minwin;
	}

}

解答:

while (ta[s.charAt(start)] == 0 || sa[s.charAt(start)] > ta[s.charAt(start)]) {
	if (sa[s.charAt(start)] > ta[s.charAt(start)]) {
		sa[s.charAt(start)]--;
	}
	start++;
}

两数之和(数组、哈希表)

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 103
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

解答:

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

二叉树的层序遍历 II(树、广度优先搜索)

给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其自底向上的层序遍历为: [ [15,7], [9,20], [3] ]

解答:

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) {
        val = x;
    }
}
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> list1 = new ArrayList<>();
        if (root == null)
            return list1;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            List<Integer> list2 = new ArrayList<>();
            int count = queue.size();
            for (int i = 0; i < count; i++) {
                TreeNode node = queue.poll();
                list2.add(node.val);
                if (node.left != null)
                    queue.add(node.left);
                if (node.right != null)
                    queue.add(node.right);
            }
            list1.add(0, list2);
        }
        return list1;
    }
}

本文内容到此结束了, 如有收获欢迎点赞

标签:end,charAt,nums,int,start,二叉树,哈希,new,两数
From: https://blog.51cto.com/zhanjq/6167928

相关文章

  • 【数据结构】二叉树先序、中序、后序及层次遍历(C语言版)
    一、图示展示1.先序遍历先序遍历可以想象为,一个小人从一棵二叉树根节点为起点,沿着二叉树外沿,逆时针走一圈回到根节点,路上遇到的元素顺序,就是先序遍历的结果先序遍历结果为:ABDHIEJCFKG动画演示:记住小人沿着外围跑一圈(直到跑回根节点),多看几次动图便能理解2.......
  • 内网渗透之哈希传递攻击
    (作业记录0x01利用VMware的克隆功能克隆一台win7,取名为win7-2。0x02启用win7和win7-2的系统管理员Administrator账户及设置密码法一启用管理员账号administrator设置密码为123456法二打开开始菜单,右击“计算机”,选择“管理”。在“计算机管理”窗口,依次定位到“本......
  • 二叉树
    树的结构一棵二叉树又三个部分组成:根节点左子树右子树我们将树的结构定义如下:classTreeNode{public: intval; TreeNode*left; TreeNode*right; intheight; TreeNode(intx):val(x),left(nullptr),right(nullptr),height(1){}; TreeNode():TreeNode(0){};};......
  • 2096. 从二叉树一个节点到另一个节点每一步的方向
    题目描述给了一个二叉树,树上所有节点的值不同再给了两个点的值表示起点和终点,问从起点到终点的最短路的方向?f1dfs预处理+最近公共祖先基本分析没有给出起点和终点是哪个点,怎么拿到?一次从root的dfss到e的最短路径是哪一条?从公共祖先分别下来的怎么从s和e求到公共祖先的pat......
  • 树:剑指 Offer 34. 二叉树中和为某一值的路径
    题目描述:给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点。 示例1: 输入:root=[5,4,8,11,null,13,4,7,2,null,null,5,1],targetSum=22输出:[[5,4,11,2],[5,8,4,5]]......
  • 114.二叉树展开为链表 Java
    114.二叉树展开为链表给你二叉树的根结点root,请你将它展开为一个单链表:展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。展开后的单链表应该与二叉树先序遍历顺序相同。示例1:输入:root=[1,2,5,3,4,null,6]输出......
  • LeetCode 145 二叉树的后序遍历
    LeetCode|145.二叉树的后序遍历给你一棵二叉树的根节点root,返回其节点值的后序遍历。示例1:1\2/3输入:root=[1,null,2,3]输出:[3,2,1]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]提示:树中节点的数目在范围[0,10......
  • 二叉树一点操作
    #include<stdio.h>#include<stdlib.h>typedefstructTree{intdata;structTree*lchild,*rchild;}Tree,*BiTree;BiTreeCreateLink(){intdata;inttemp;BiTreeT;scanf("%d",&data);temp=getchar()......
  • 二叉树的前序遍历
    LeetCode|144二叉树的前序遍历给你二叉树的根节点root,返回它节点值的 前序 遍历。示例1:1\2/3输入:root=[1,null,2,3]输出:[1,2,3]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]示例4:1/2输入:root=......
  • day17| 110.平衡二叉树;257.二叉树的所有路径;404.左叶子之和
    110.平衡二叉树 自顶向下递归 1.获得计算二叉树高度的函数2.对于遍历到的节点,首先计算左右子树的高度,看是否平衡3.在分别遍历到左右子树,判断左子树和右子树是否平衡 代码如下:classSolution:defisBalanced(self,root:TreeNode)->bool:defhei......