Leetcode刷题笔记3

18. 四数之和

18. 四数之和 - 力扣(LeetCode)

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]]
(若两个四元组元素一一对应,则认为两个四元组重复):

0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

示例 1:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

解法一:排序 + 暴力枚举 + 理由set去重

超时

解法二:排序 + 双指针

[-2, -1, 0, 0, 1, 2] target
       [                 ] target - a
  a
       b [              ] target - a - b
        left  right
1. 先依次固定一个a;
2. 在a后面的区间内,利用“三数之和”找到三个数,使这三个数的和等于target - a即可

三数之和的大体思路:
1. 依次固定一个b;
2. 在b后面的区间内,利用“双指针”找到两个数,使这两个数的和等于target - a - b即可

处理细节问题:
1. 不重
去重a,b,left,right

2. 不漏

时间复杂度:O(N^3)

代码:C++

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> ret;
        // 排序
        sort(nums.begin(), nums.end());
        // 利用双指针解决问题
        int n = nums.size();
        for(int i=0; i<n; ) //固定a
        {
            // 利用三数之和
            for(int j=i+1; j<n; ) //固定b
            {
                // 双指针
                int left = j+1, right = n-1;
                long long aim = (long long)target - nums[i] - nums[j];
                while(left<right)
                {
                    int sum = nums[left] + nums[right];
                    if(sum < aim) left++;
                    else if(sum > aim) right--;
                    else
                    {
                        ret.push_back({nums[i], nums[j], nums[left++], nums[right--]});
                        // 去重1
                        while(left < right && nums[left] == nums[left - 1]) left++; //当left右移完之后和左边这个数相比,如果相同,说明重复元素,需要跳过
                        while(left < right && nums[right] == nums[right + 1]) right--;
                    }
                }
                // 去重2
                j++;
                while(j < n && nums[j] == nums[j - 1]) j++;
            }
            // 去重3
            i++;
            while(i < n && nums[i] == nums[i - 1]) i++;
        }
        return ret;
    }
};

209. 长度最小的子数组

209. 长度最小的子数组 - 力扣(LeetCode)

 

解法一:暴力枚举出所有子数组的和

时间复杂度:O(N^3)

 R 
[2, 3, 1, 2, 4, 3]
 L
先定义一个sum,计算左区间的和
比如:sum + 2 + 3 + ...
这样可以省去再遍历一遍数组

     R
[2, 3, 1, 2, 4, 3]
 L
sum = 5

         R
[2, 3, 1, 2, 4, 3]
 L
sum = 6
len 2 -> 3

...

                 R
[2, 3, 1, 2, 4, 3]
 L
sum = 12
len = 5

这个len是一直增长的,所以肯定不是最短的结果

接下来让L向左移动一位,然后继续让R从左开始移动
那这个时候从3开始的区间可以在上一个结果中找到

解法二:利用单调性,使用“同向双指针”来优化,也就是 滑动窗口

当使用暴力解法时。两个指针都可以做到不回退,都是向一个方向移动时就可以使用滑动窗口

1. 初始化;left = 0, right = 0

2. 进窗口

3. 判断是否是结果,然后更新结果(长度),再出窗口,判断len

2和3一直循环

以下是图解:

 

 
4. 为什么不往后枚举呢?因为已经知道接下来的情况再枚举也是白枚举,因为是正整数数组
利用单调性,规避了很多没有必要的枚举行为

5. 时间复杂度
进窗口要一个循环,判断也是一个循环,等于是两层循环套在一起
但是总的操作次数只是2n次
所以最终的时间复杂度是一个O(N)

代码:C++

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size();
        int sum = 0, len = INT_MAX; //如果定义0,那最终的求min结果就是0,所以定义一个大的变量,不干扰最终结果
        for(int left = 0, right = 0; right < n; right++)
        {
            // 进入窗口
            sum += nums[right];

            //判断要不要缩小窗口
            while(sum >= target)
            {
                len = min(len, right - left + 1); // 更新结果
                sum -= nums[left++]; // 出窗口
            }
            // 一直更新到窗口不符合要求位置,然后right++
        }
        return len == INT_MAX ? 0 : len; // 如果没有最终结果就返回0,不然就返回len
    }
};

3. 无重复字符的最长子串

3. 无重复字符的最长子串 - 力扣(LeetCode)

子串和字数组都是连续的一段


解法一:暴力枚举 + 哈希表(判断字符是否重复出现)

可以借助哈希表来判断是否有重复字符
遍历的时候把字符保存到哈希表里,当遍历到重复元素时,停止这个操作

 R
[d, e, a, b, c, a, b, c, a]
 L

                    R
[d, e, a, b, c, a, b, c, a]
 L

当a重复时,停止这个操作,然后移动L,

                     R
[d, e, a, b, c, a, b, c, a]
     L

时间复杂度:O(N^2)

解法二:利用规律,使用“滑动窗口”来解决问题

 R
[d, e, a, b, c, a, b, c, a]
 L

                      R
[[d, e, a, b, c], a, b, c, a]
  L

当a重复时,停止这个操作,然后移动L,

                       R
[[d, e, a, b, c], a, b, c, a]
              L

当发现区间里面有重复字符时,可以让L先跳过这个重复字符
R也不用回到L的位置,让R继续移动即可
此时就可以使用滑动窗口解决问题

1. 先定义L = 0和R = 0

2. 进窗口 -> 让字符进入哈希表

3. 判断
根据判断结果判定是否出窗口(窗口内出现重复字符时才出窗口)

判断和出窗口是一个循环,一直到没有重复字符为止

出窗口就是从哈希表中删除该字符

然后更新结果(更新结果的过程要根据题目决定在哪)
本题中,在整个判断之后,更新结果

为什么要用滑动窗口,因为两个指针都不会回退

时间复杂度:O(N)
空间复杂度:O(1)
因为哈希表只有128位,所以可以忽略不计

代码:C++

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        // 下标表示字符,让里面的数来表示是否重复出现,出现一次为1,两次为2...
        int hash[128] = {0}; // 使用数组表示哈希表

        int left = 0, right = 0, n = s.size();
        int ret = 0;
        while(right < n)
        {
            hash[s[right]]++; // 字符对应的下标,进入窗口

            while(hash[s[right]] > 1) // 判断
            {
                hash[s[left++]]--; // 先把哈希表里面的对应的值--,表示它从哈希表删除,然后++完成出窗口的操作
            }
            ret = max(ret, right - left + 1); // 更新结果,区间的长度是right - left + 1
            right++; // 让下一个元素进入窗口
        }
        return ret;
    }
};

1004. 最大连续1的个数 III

1004. 最大连续1的个数 III - 力扣(LeetCode)

最多k个0说明可以翻转0,1,2,...,一直到k个为止
比如下方这个例子中,k最多可以翻转100个0,但其实不需要翻转100次
[1,1,0,0,1,1,0], k = 100

[1,1,1,0,0,0,1,1,1,1,0], K = 2
               [                 ],最长为6

可以等价处理,在数组中满足0的个数不超过k次即可,只要这个区域的0不超过k,那么这个区域是一定可以翻转成功的
把原始问题转换成:
找出最长的子数组,0的个数不超过k个
 

解法一:暴力枚举 + zero计数器(int类型变量,统计0出现多少次)

 R
[1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0], K = 2
 L
zero = 0
             R
[1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0], K = 2
 L
zero = 1

                       R
[[1, 1, 1, 0, 0], 0, 1, 1, 1, 1, 0], K = 2 固定第一个位置的最优解
 L
zero = 2

然后R继续从数组最开始的位置开始移动

解法二:滑动窗口

所以可以让R越过这段区域,不用重新遍历,可以移动L
                     R
[1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0], K = 2 
                 L

当在暴力枚举中L和R都只往一个方向移动时,可以使用滑动窗口

1. left = 0, right = 0

2. 进窗口 -> 如果是1,无视;如果是0,计数器+1
当R向后移动时就相当于进窗口了
当进入窗口时无视,当碰到0时,计数器加一

3. 判断 -> 当zero大于k,出窗口
出窗口
让L一直右移,直到窗口合法为止

当判断结束之后,更新结果,当R移动到最后位置就会得到最终结果

时间复杂度:O(N)
空间复杂度:O(1)

代码:C++

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) 
    {
        int ret = 0;
        for(int left = 0, right = 0, zero = 0; right < nums.size(); right++)
        {

            if(nums[right] == 0) zero++; // 进窗口
            while(zero > k) // 判断窗口是否合法
            {
                if(nums[left++] == 0) zero--; // 出窗口,left向后移动
            } 
            // 左闭右闭的区间
            ret = max(ret, right - left + 1); // 更新结果
        }
        return ret;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue期末复习选择题1

1. 下面哪一项描述是错误的&#xff1f;&#xff08;B&#xff09; A.$("ul li:gt(5):not(:last)")选取ul标记里面索引值大于5且不是最后一个的li元素B.$("div").find("span")选取div元素的子元素spanC.$("div.showmore > a")选取…

合约开发的基本结构剖析及前置知识梳理

前置知识点 上下文变量初步 合约函数的背后是transaction&#xff0c;上下文变量访问的是transaction中的信息两个上下文变量&#xff1a;tx和msg ERC20 规范代码实现Metamask测试 ganache-cli的安装 安装 npm install -g ganache-cli启动 ganache-cli如果出现以下这种…

本特利330103-03-09-10-02-00 PLC模块技术分析与应用探讨

本特利330103-03-09-10-02-00 PLC模块技术分析与应用探讨 一、引言 在工业自动化领域中&#xff0c;可编程逻辑控制器&#xff08;PLC&#xff09;作为核心控制设备&#xff0c;其性能的稳定性和可靠性直接关系到整个生产线的运行效率。本特利&#xff08;Bentley&#xff09;…

求第 N 个泰波那契数 | 动态规划

1.第 N 个泰波那契数 题目连接&#xff1a;1137. 第 N 个泰波那契数 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 2.什么是动态规划 在解决这道问题之前…

获取日期区间的所有日期

借助moment.js 转换指定格式&#xff0c;首先安装npm install moment --save methods:{enumerateDaysBetweenDates(startDate, endDate) { // 假定你已经保证了startDate 小于endDate&#xff0c;且二者不相等let daysList [];let SDate this.$moment(startDate);let EDate …

计算机系统基础 8 循环程序

概要 两种实现方法——分支指令实现和专门的循环语句实现以及有关循环的优化。 分支指令实现 倒计数 …… MOV ECX&#xff0c;循环次数 LOOPA&#xff1a;…… …… DEC ECX JNE LOOPA 正计数 …… MOV ECX&#xff0c;0 LOOPA&#xff1a; …… INC ECX CMP …

U-Boot menu菜单分析

文章目录 前言目标环境背景U-Boot如何自动调起菜单U-Boot添加自定义命令实践 前言 在某个厂家的开发板中&#xff0c;在进入它的U-Boot后&#xff0c;会自动弹出一个菜单页面&#xff0c;输入对应的选项就会执行对应的功能。如SD卡镜像更新、显示设置等&#xff1a; 目标 本…

ESP8266实现获取天气情况

利用太极创客提供的ESP8266 心知天气库获取天气情况并显示 心知天气库地址&#xff1a; ESP8266-心知天气: 本库主要功能为使用ESP8266物联网开发板通过心知天气 API 获取天气等信息。 clone到本地: git clone https://gitee.com/taijichuangke/ESP8266-Seniverse.git 安装该…

go语言的一些常见踩坑问题

开始之前&#xff0c;介绍一下​最近很火的开源技术&#xff0c;低代码。 作为一种软件开发技术逐渐进入了人们的视角里&#xff0c;它利用自身独特的优势占领市场一角——让使用者可以通过可视化的方式&#xff0c;以更少的编码&#xff0c;更快速地构建和交付应用软件&#…

ArkUI-X开发指南:【SDK配置和构建说明】

ArkUI-X SDK配置和构建说明 ArkUI-X SDK是ArkUI-X开源项目的编译产物&#xff0c;可将ArkUI-X SDK集成到现有Android和iOS应用工程中&#xff0c;使开发者基于一套ArkTS主代码&#xff0c;就可以构建支持多平台的精美、高性能应用。SDK内容包含ArkUI跨平台运行时&#xff0c;组…

【高频】从输入URL到页面展示到底发生了什么?

一、相关衍生面试问题&#xff1a; 浏览器输入美团网站&#xff0c;从回车到浏览器展示经历了哪些过程 &#xff1f; http输入网页之后的流程&#xff1f; 百度搜索页面&#xff0c;从点开搜索框&#xff0c;到显示搜索页面经历了什么&#xff1f; 二、探究各个过程&#x…

[Algorithm][回溯][记忆化搜索][最长递增子序列][猜数字大小Ⅱ][矩阵中的最长递增路径]详细讲解

目录 1.最长递增子序列1.题目链接2.算法原理详解3.代码实现 2.猜数字大小 II1.题目链接2.算法原理详解3.代码实现 3.矩阵中的最长递增路径1.题目链接2.算法原理详解3.代码实现 1.最长递增子序列 1.题目链接 最长递增子序列 2.算法原理详解 题目解析&#xff1a;从每个位置&am…

【BUG】Edge|联想电脑 Bing 搜索报错“Ref A: 乱码、 Ref B:乱码、Ref C: 日期” 的解决办法

文章目录 省流版前言解决办法 详细解释版前言问题描述与排查过程解决办法与总结 省流版 我原以为我解决了&#xff0c;才发的博客&#xff0c;晚上用了一下其他设备发现还是会出现这个问题… 这篇博客并未解决该问题&#xff0c;如果评论里有人解决了这个问题不胜感激&#x…

博客说明 5/12~5/24【个人】

博客说明 5/12~5/24【个人】 前言版权博客说明 5/12~5/24【个人】对比最后 前言 2024-5-24 13:39:23 对我在2024年5月12日到5月24日发布的博客做一下简要的说明 以下内容源自《【个人】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作…

Undet for SketchUp 2023.3 点云建模软件 支持支持草图大师sketchup2021-2022-2023

1.Undet for sketchup 2023.3支持草图大师sketchup2021-2022-2023。支持机载雷达扫描、车载扫描还是地面扫描&#xff0c;对AEC行业用户来说&#xff0c;真正需要的是如何将这些数据快速处理为三维模型&#xff0c;这样才能将这些信息延展到BIM领域发挥效用。因此面对这些海量的…

【真实项目中收获的提升】- 前后端联调

场景 小型项目前后端联调&#xff0c;不需要部署到sit或uat环境下。 解决方法 后端部署frp服务 下载frp软件 配置frpc.ini文件&#xff0c;先把文件设置可编辑(可同时配置多个 例如下面的chz 上面打码的是frp服务器地址) 然后起start.bat 其实就是执行frpc -c frpc.ini命令…

4、PHP的xml注入漏洞(xxe)

青少年ctf&#xff1a;PHP的XXE 1、打开网页是一个PHP版本页面 2、CTRLf搜索xml&#xff0c;发现2.8.0版本&#xff0c;含有xml漏洞 3、bp抓包 4、使用代码出发bug GET /simplexml_load_string.php HTTP/1.1 补充&#xff1a; <?xml version"1.0" encoding&quo…

DockerNetwork

Docker Network Docker Network 是 Docker 引擎提供的一种功能&#xff0c;用于管理 Docker 容器之间以及容器与外部网络之间的网络通信。它允许用户定义和配置容器的网络环境&#xff0c;以便容器之间可以相互通信&#xff0c;并与外部网络进行连接。 Docker Network 提供了以…

docker容器安装mysql

linux: centOS-7 hadoop: 3.3.6 前置章节&#xff1a; (图文并茂)基于CentOS-7搭建hadoop3.3.6大数据集群-CSDN博客 可选&#xff1a;zookeeper安装教程-CSDN博客 1.安装docker 1.1 添加docker的repo源 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/…

猫狗电子玩具底层方案开发

物在现代年轻人中的地位已经超越了简单的“宠物”定义&#xff0c;它们已经成为了家庭的一部分&#xff0c;是人们生活中不可或缺的伴侣和朋友。 因此营运而生了很多宠物用品&#xff0c;比如喂食器、电子逗猫棒、饮水机、说话按钮等等宠物电子玩具周边。宠物玩具在宠物生活中…