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--]});// 去重1while(left < right && nums[left] == nums[left - 1]) left++; //当left右移完之后和左边这个数相比,如果相同,说明重复元素,需要跳过while(left < right && nums[right] == nums[right + 1]) right--;}}// 去重2j++;while(j < n && nums[j] == nums[j - 1]) j++;}// 去重3i++;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 + 1right++; // 让下一个元素进入窗口}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;}
};

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

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

相关文章

解决Element组件el-switch在Vue中值的绑定与回显问题

概要 Switch 开关表示两种相互对立的状态间的切换,多用于触发「开/关」。可当一个布尔值进行使用。 问题描述与解决 引入Element组件的switch到Vue中,可以读取switch的值,但如果放在页面中,不能回显上去。 如上图,无论值是"否"还是“是”。都不能正确渲染到页…

vue-officef实现pdf文件在线预览

一、参考网址 https://www.cnblogs.com/guozhiqiang/p/17957288 1、引入依赖 npm install vue-office/pdf vue-demi2、编写组件 <template><vue-office-pdf :src"pdf"/> </template> <script> // import pdf from vue-pdf import VueOffice…

基于长短期记忆网络 LSTM 的送餐时间预测

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

实战13:lstm bp 机器学习随机森林粮食产量预测-完整代码数据

直接看视频: lstm bp 机器学习随机森林粮食产量预测-完整代码数据_哔哩哔哩_bilibili 看数据: 代码: from sklearn.linear_model import LinearRegression from sklearn import preprocessing import random from sklearn.model_selection import train_test_split from…

postgresql|数据库|闪回插件e-maj的部署和使用

前言&#xff1a; E-Maj 是 PostgreSQL 数据库的一个扩展插件&#xff0c;它的全称为 "Elementary Majordomo"。这个扩展的主要功能是为数据库中的表集提供细粒度的写入日志记录和时间旅行能力。这意味着使用 E-Maj 的用户可以在数据库的特定子集上实现事务的回滚&a…

C++笔记之Unix时间戳、UTC、TSN、系统时间戳、时区转换、local时间笔记

C++笔记之Unix时间戳、UTC、TSN、系统时间戳、时区转换、local时间笔记 ——2024-05-26 夜 code review! 参考博文 C++笔记之获取当前本地时间以及utc时间

Linux定时计划

定时计划 一、计划任务种类 突发性&#xff1a;临时决定只执行一次的任务 at&#xff1a;处理执行一次任务就结束定时性&#xff1a;每隔一定时间需要重复执行此命令 crontab&#xff1a;指定任务&#xff0c;按照设定的周期一直循环执行二、作用 定时任务可以用于自动备份…

TCP/IP协议(一)

一.报文和协议 协议有什么作用&#xff1f;协议定义通信实体间所交换报文的格式和次序&#xff0c;以及在报文发送和/或接收或者其他事件方面所采取的行动(响应)。 什么是报文&#xff1f;指在网络中传输的数据单元&#xff0c;网络通讯的基本单位。&#xff08;HTTP报文、TCP报…

链式二叉树的前,中,后序遍历 AND 结点个数及高度等 文末附带全部代码

目录 前言1. 前序遍历2. 中序遍历3. 后续遍历4. 二叉树结点的个数5. 二叉树叶子结点个数6. 二叉树的高度7. 二叉树第K层结点的个数8. 二叉树查找值为x的结点全部代码总结 正文开始 前言 本文旨在介绍二叉树的链式存储中一些函数的实现 博客主页: 酷酷学!!! 更多文章, 期待关…

01主动安全系统

“安全”一直是车主对车辆考核的重要指标。车辆安全可以分为从主动安全和被动安全两个方面进行分类。今天就来说说汽车主动安全系统的那些事儿。 01.什么是主动安全系统&#xff1f; 主动安全是指尽量自如地操纵控制汽车的安全系统措施。无论是直线上的制动与加速还是左右打方…

【调试笔记-20240526-Linux-在 OpenWrt-23.05 发行版上安装 cloudreve】

调试笔记-系列文章目录 调试笔记-20240526-Linux-在 OpenWrt-23.05 发行版上安装 cloudreve 文章目录 调试笔记-系列文章目录调试笔记-20240526-Linux-在 OpenWrt-23.05 发行版上安装 cloudreve 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调…

RTOS(3)极简ARM架构与汇编

1.掌握八条汇编指令即可 读内存loadLDR R0&#xff0c;[addrA]写内存storeSTR R0&#xff0c;[addrA]加ADD R0&#xff0c;R1&#xff0c;R2减SUB R0&#xff0c;R1&#xff0c;R2比较CMP R0&#xff0c;R1跳转B / BL入栈PUSH { R3&#xff0c;LR }出…

网络原理-以太网协议和DNS协议

一、以太网协议 以太网协议会涉及到数据链路层和物理层。 如图&#xff1a; 这里面的目的地址和源地址指的并不是IP地址,而是MAC地址(物理地址)。长度为6个字节。即最多能表示2^48 个地址,也是非常大的,足够给全球每个设备都分配一个地址,因此在网卡出厂的时候都会带有一个唯…

力扣刷题--2176. 统计数组中相等且可以被整除的数对【简单】

题目描述 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k &#xff0c;请你返回满足 0 < i < j < n &#xff0c;nums[i] nums[j] 且 (i * j) 能被 k 整除的数对 (i, j) 的 数目 。 示例 1&#xff1a; 输入&#xff1a;nums [3,1,2,2,2,1,3], k …

# linux 系统 没有 ifconfig 命令,提示: ifconfig: command not found

sudo ip route add default via 192.168.1.1 dev eth0# linux 系统 没有 ifconfig 命令&#xff0c;提示&#xff1a; ifconfig: command not found 一、问题描述&#xff1a; 有些伙伴在学习 linux 系统时&#xff0c;在 使用 ifconfig 命令 查询 系统 IP 出现 ifconfig: co…

06中间件RTOS/CP

Autosar CP 操作系统详解-CSDN博客 1. 什么是RTOS &#xff1f; RTOS&#xff0c;英文全称是 Real-time Operation System&#xff0c;中文就是 实时操作系统&#xff0c;又称及时操作系统。 实时操作系统&#xff0c;是指当外界事件或数据产生时&#xff0c;能够接受并以足…

中国人工智能大模型价格战

近年来&#xff0c;人工智能技术迅猛发展&#xff0c;尤其是大模型领域的突破让人们看到了更多的可能性。然而&#xff0c;在这一高科技领域&#xff0c;中美两国的竞争日趋激烈。近日&#xff0c;中国互联网巨头们纷纷启动大模型价格战&#xff0c;引发了广泛关注。这场价格战…

怎么在Qt Designer设计的界面上显示Matplotlib的绘图?

首先&#xff0c;利用Qt Designer设计界面。 设计好后保存为ui文件。 接着&#xff0c;将ui文件转为py文件。 我喜欢在python中进行转换&#xff0c;因此把转换命令封装为函数&#xff0c;运行一下即可。 import os # pyuic5 -o output_file.py input_file.ui #通过命令把.ui…

【云原生】Kubernetes-----POD资源限制与探针机制

目录 引言 一、资源限制 &#xff08;一&#xff09;基本定义 &#xff08;二&#xff09;资源单位 1.CPU资源 2.内存资源 &#xff08;三&#xff09;请求与限制 &#xff08;四&#xff09;定义方式 1.编写yaml文件 2.查看资源情况 二、Pod探针机制 &#xff08;…

动态规划之背包问题中如何确定遍历顺序的问题-组合or排列?

关于如何确定遍历顺序 322. 零钱兑换中&#xff0c;本题求钱币最小个数&#xff0c;那么钱币有顺序和没有顺序都可以&#xff0c;都不影响钱币的最小个数。 所以本题并不强调集合是组合还是排列。 如果求组合数就是外层for循环遍历物品&#xff0c;内层for遍历背包。 如果求…