Leetcode刷题笔记5

news2024/11/17 13:46:07

76. 最小覆盖子串

76. 最小覆盖子串 - 力扣(LeetCode)

解法一: 暴力枚举 + 哈希表

先定义left和right,可以在随机位置
枚举一个位置向后找,找到一个位置之后,发现这段区间是一个最小的区间之后,让left移动一格
然后right继续从left开始向后找

输入:s = "ADOBECODEBANC", t = "ABC"
hash1:
在t中A出现1次,B出现1次,C出现1次

hash2:
在s中,记录ABC出现几次
只要在hash2中,字符统计出现的次数大于等于hash1,那么就是一个有效的枚举

优化:
          符合要求
s = "-----------------------------"
          [L        R]

当left向左移动一步时,会有两种情况
1:依旧符合要求
right不动

2:不符合要求
right向右移动,找符合要求的位置

两个指针是同向运动的,所以单调性,所以可以使用滑动窗口

解法二:滑动窗口 + 哈希表

s = "A D O B E C O D E B A N C", t = "ABC"
       L
          R

1. left = 0, right = 0

2. 进窗口 -> hash2[in]++

3. 判断,当窗口刚好合法时出窗口 -> check(hash1, hash2)

更新结果 -> 起始位置、最终的最短长度

出窗口 -> hash2(out)--

判断成立先更新结果,再出窗口然后继续判断

优化:判断条件
使用变量count标记有效字符的“种类”

1. 进窗口 -> 进之后,当hash2(in) == hash1(in), count++
只要hash2里面A的个数与hash1里面A的个数相等时统计

2. 出窗口 -> 出之前,当hash2(out) == hash1(out), count--
比如出窗口后,hash2里面A的个数从1变成了0,然后hash1里面A为1,成为了无效字符,那么count--

3. 判断条件 -> count == hash1.szie()

代码:C++

class Solution {
public:
    string minWindow(string s, string t) 
    {
        // 数组模拟哈希表,因为全是英文字符
        int hash1[128] = {0}; // 统计字符串t中每个字符的频次
        int hash2[128] = {0}; // 统计窗口内每个字符的频次
        int kinds = 0; // 统计有效字符有多少种
        for(auto ch : t) 
        {
            // if(hash[ch] == 0) kinds++;
            // hash[ch]++;
            // 同上
            if(hash1[ch]++ == 0) kinds++; // 加之前如果等于0,说明找到一个有效字符,所以kinds++
        }



        int minlen = INT_MAX, begin = -1; // minlen是最小覆盖子串长度,begin存的是起始位置
        for(int left=0, right=0, count=0; right<s.size(); right++)
        {
            char in = s[right];
        //     hash2[in]++;
        //     if(hash2[in] == hash1[in])
        //     {
        //         count++;
        //     }
        // 同上
            if(++hash2[in] == hash1[in]) count++; // 进窗口+维护count变量

            while(count == kinds) // 判断条件
            {
                // 只要窗口长度小于minlen
                if(right - left + 1 < minlen) // 更新结果
                {
                    minlen = right - left + 1;
                    begin = left;
                }
                // 出窗口
                char out = s[left++];

                // if(hash2[out] == hash1[out]) count--;
                // hash2[out]--;

                // 同上
                if(hash2[out]-- == hash1[out]) count--; // 说明此时有效字符的种类要减少
            }
        }
        if(begin == -1) return ""; // 如果等于-1说明没有找到一个子串,返回空串
        else return s.substr(begin, minlen); // 找到了就把它裁出来
    }
};

704. 二分查找

704. 二分查找 - 力扣(LeetCode)

原理:
[1, 2, 3, 4, 5, 6, 7, 8], t = 5

解法一:暴力解法 -> O(N)

从左往右依次用t跟数组的元素对比

比如选择4,那么在升序数组中,4和4左边区间的元素肯定比5小

解法二:二分查找算法“二段性”

当数组有二段性的时候就可以用二分查找算法

二段性:
当我们发现一个规律,然后根据这个规律选取某一个点后,能把这个数组分成两部分
然后根据规律可以有选择性的舍去一部分,然后根据这个规律在另一个部分里面继续查找的时候就可以用二分查找

选择中间点,时间复杂度最优

                 M
[                x                 ], t
 L                               R

L = left, R = right, M = mid

朴素版本二分查找算法的核心:

第一种情况:x < t,删除左区间 -> left = mid + 1 -> 然后再在更新之后的[left, right]区间寻找结果

第二种情况:x > t,删除右区间 -> right = mid - 1 -> 然后再在更新之后的[left, right]区间寻找结果

第三种情况:x = t,直接返回结果

细节问题:
1. 循环结束的条件 -> left > right

2. 为什么是正确的

3. 时间复杂度
循环1次:\frac{n}{2}
2次:\frac{n}{4}
3次:\frac{n}{8}
...
x次:1 -> \frac{2^{x}}{n} -> 2^{x} = n -> x = logN

代码实现:C++

class Solution {
public:
    int search(vector<int>& nums, int target) 
    {
        int left = 0, right = nums.size() - 1;
        while(left <= right)
        {
            // int mid = (left + right) / 2; // 有溢出风险
            int mid = left + (right - left)/2; // 防止溢出
            if(nums[mid] < target) left = mid + 1;
            else if(nums[mid] > target) right = mid - 1;
            else return mid;
        }
        return -1;
    }
};

二分查找的朴素版本模版:

// 朴素二分模版
// 
        int left = 0, right = nums.size() - 1;
        while (left <= right)
        {
            int mid = left + (right - left) / 2; 
            if (......) 
                  left = mid + 1;
            else if (......) 
                  right = mid - 1;
            else 
                  return ......;
        }

JZ64 求1+2+3+...+n

求1+2+3+...+n_牛客题霸_牛客网 (nowcoder.com)

由于题目限制了常规的控制语句和条件判断,不能使用典型的循环或递归方法,我们需要找到一种绕开这些限制的方法来实现累加。

可以先定义一个类,在其构造函数中实现累加操作。

构造函数Sum():每次创建Sum类的对象时,构造函数会执行一次,将当前的i值加到sum中,并将i自增1

int i = 1; // 初始化一个全局变量 i,初始值为 1,从1开始累加
int sum = 0; 

class Sum {
public:
    Sum() {
        sum += i; // 在构造函数中,将当前的 i 值加到 sum 上
        ++i; // 将 i 自增 1
    }
};

在主函数里面调用这个函数

class Solution {
public:
    int Sum_Solution(int n) {
        Sum a[n]; // 创建一个 Sum 类的对象数组 a,大小为 n
        return sum; // 返回全局变量 sum 的值
    }
};

每次创建Sum类的对象时,构造函数会自动执行累加操作。通过创建一个包含n个对象的数组,可以自动调用构造函数n次。

在C++中,创建一个类对象数组会自动调用数组中每个对象的构造函数。通过创建一个包含n个对象的数组,可以确保构造函数被调用n次,从而完成累加。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1704785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ day1 作业练习

整理思维导图 定义自己的命名空间my_sapce&#xff0c;在my_sapce中定义string类型的变量s1&#xff0c;再定义一个函数完成对字符串的逆置。 #include <iostream> #include <cstring>using namespace std; namespace my_space {string s1; }void show() {cout<…

ONLYOFFICE 协作空间与 WordPress 如何集成

转载自作者&#xff1a;VincentYoung&#xff0c;略有改动 阅读本文&#xff0c;了解如何将 ONLYOFFICE 协作空间与 WordPress 进行集成。 ONLYOFFICE 协作空间是其去年新推出的产品&#xff0c;用创建虚拟办公室房间的方式&#xff0c;来组织公司内部团队成员的在线协作办公&…

FBA头程空运物流的运输时效与计费方式解析

FBA头程空运物流&#xff0c;是运用专业的货机或搭载货物的客机&#xff0c;为轻小商品提供的一种直接、迅速的配送服务。它尤其适合时间紧促的物流伙伴&#xff0c;尽管相较于其他运输方式&#xff0c;空运成本可能稍高&#xff0c;但其卓越的时效性为物流伙伴带来了极高的性价…

单片机的内存映射和重映射

内存映射 在单片机内&#xff0c;不管是RAM还是ROM还是寄存器&#xff0c;他们都是真实存在的物理存储器&#xff0c;为了方便操作&#xff0c;单片机会给每一个存储单元分配地址&#xff0c;这就叫做内存映射。 单片机的内存映射是指将外部设备或外部存储器映射到单片…

linux下的openssh简介(centos 8)

目录 1. 简介2. 安装 OpenSSH3. 配置 OpenSSH 服务器3.1 服务器配置文件配置文件的详解 3.2 安全操作——修改 SSH 端口3.3 安全操作——禁止 root 登录3.4 安全操作——密钥认证3.5 安全操作——禁止密码认证 4. 配置 OpenSSH 客户端4.0 常用命令4.0.1 ssh常用命令4.0.2 scp常…

ubuntu22部署Docker私有仓库Harbor (http https方式)

harbor日志&#xff1a;/var/log/harbor 前置安装配置 需先安装docker和docker-compose&#xff1a; 0.配置清华大学apt源并安装docker #信任 Docker 的 GPG 公钥: sudo apt-get install ca-certificates curl gnupg curl -fsSL https://download.docker.com/linux/ubunt…

遥测终端机RTU:为水利细分场景量身定制的智能化应用

在日益智能化的现代社会&#xff0c;水利行业正迎来前所未有的变革。为了更好地满足水利细分场景的需求&#xff0c;我们针对每个细分场景推出了专用遥测终端机&#xff0c;为您的水利工作带来前所未有的便捷与高效。 为一款智能化应用&#xff0c;遥测终端机的安全性也是我们…

图形学初识--纹理采样和Wrap方式

文章目录 前言正文1、为什么需要纹理采样&#xff1f;2、什么是纹理采样&#xff1f;3、如何进行纹理采样&#xff1f;&#xff08;1&#xff09;假设绘制区域为矩形&#xff08;2&#xff09;假设绘制区域为三角形 4、什么是纹理的Wrap方式&#xff1f;5、有哪些纹理的Wrap方式…

强大友好的Nginx扩展:VeryNginx

VeryNginx&#xff1a; 简化Web管理&#xff0c;增强网站防御- 精选真开源&#xff0c;释放新价值。 概览 VeryNginx是一个基于lua-nginx-module&#xff08;openresty&#xff09;的高效、友好的Nginx版本&#xff0c;专为满足现代Web应用的需求而设计。它不仅提供了强大的We…

Java | Leetcode Java题解之第115题不同的子序列

题目&#xff1a; 题解&#xff1a; class Solution {public int numDistinct(String s, String t) {int m s.length(), n t.length();if (m < n) {return 0;}int[][] dp new int[m 1][n 1];for (int i 0; i < m; i) {dp[i][n] 1;}for (int i m - 1; i > 0; …

K-means聚类模型入门介绍

K-means聚类是一种无监督学习方法&#xff0c;广泛应用于数据挖掘、机器学习和模式识别等领域&#xff0c;用于将数据集划分为K个簇&#xff08;cluster&#xff09;&#xff0c;其中每个簇的数据具有相似的特征。其基本思想是通过迭代寻找使簇内点间距离平方和最小的簇划分方式…

【Java SE】超详细讲解String类(上)

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 初步认识String2. String类的常用方法2.1 字符串构造2.2 String对象比较2.2.1 比较是否引用同一个对象2.2…

创新实训2024.05.28日志:记忆化机制、基于MTPE与CoT技术的混合LLM对话机制

1. 带有记忆的会话 1.1. 查询会话历史记录 在利用大模型自身能力进行对话与解答时&#xff0c;最好对用户当前会话的历史记录进行还原&#xff0c;大模型能够更好地联系上下文进行解答。 在langchain chat chat的chat函数中&#xff0c;通过实现langchain框架提供的ChatMemo…

XGIS引擎上线曲折历史

演示地址&#xff1a;threelab首页 其实在一年前甚至更早&#xff0c;已经完整了初版的XGIS三维引擎开发&#xff0c;完成了基本的操作。 但是很多原因导致我一直没有上线&#xff0c;也不是没有上线&#xff0c;上线了&#xff0c;又下掉了。总感觉自己写的欠缺&#xff0c;或…

Easy-laser激光对中仪维修D505激光测平仪维修

Easylaser激光对中仪多应用于风力发电业的塔架、机架、轮毂、偏航轴承和变桨轴承的几何指标测量中。此系列常见维修型号包括D450&#xff1b;D480&#xff1b;D505&#xff1b;D525&#xff1b;D550等。 Easy-Laser对中仪维修注意事项&#xff1a; 测量功能包括&#xff1a; …

虚拟化技术 分布式资源调度

一、实验内容 实现分布式资源调度 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建议4C8G或以上配置已安装VMware Workstation Pro已安装Windows Server 2008 R2 x64已安装vCenter Server 三、实验步骤 将主机esxi1和esxi2加入…

JVM-之GC日志

一、 开启gc 日志 在项目中开启GC 日志打印后会查看gc 日志如下 nohup java -Xms768m -Xmx768m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath./dumplog/dumplog.log -Xloggc:./dumplog/gc.log -XX:PrintGCDetails -XX:PrintGCDateStamps -XX:PrintHeapAtGC -jar xxxx…

小易大数据:大数据报告查询领域的黑马,这些优势让你无法忽视!

随着大数据技术被运用到各行各业&#xff0c;风控领域也不例外&#xff0c;形成了基于大数据技术的大数据信用&#xff0c;也就是我们常说的大数据报告或者网贷大数据&#xff0c;在众多的查询平台中&#xff0c;小易大数据平台在市面上是比较受欢迎的&#xff0c;那在小易平台…

使用华为快传同步文件至电脑

使用华为快传同步文件至电脑&#xff0c;电脑端未发现设备解决办法 1、手机和电脑连同一网络 2、打开手机华为分享&#xff0c;打开电脑网络 3、网络中找到设备&#xff0c;输入账户密码进行连接&#xff08;未找到设备往下继续看&#xff09; 未找到设备解决办法&#xff1…

电脑如何在网页上下载视频 浏览器如何下载网页视频

对于现代职场人士而言&#xff0c;在日常生活中难免需要下载各种短视频&#xff0c;IDM下载加速器可以轻松获取抖音、快手等平台的无水印短视频文件。 Internet Download Manager&#xff0c;简称IDM。功能强大的网络下载器。您不需要多余的操作&#xff0c;IDM 能捕获您的下载…