【leetcode刷题之路】面试经典150题(2)——双指针+滑动窗口+矩阵

文章目录

      • 2 双指针
        • 2.1 【双指针】验证回文串
        • 2.2 【双指针】判断子序列
        • 2.3 【双指针】两数之和 II - 输入有序数组
        • 2.4 【双指针】盛最多水的容器
        • 2.5 【双指针】三数之和
      • 3 滑动窗口
        • 3.1 【双指针】长度最小的子数组
        • 3.2 【滑动窗口】无重复字符的最长子串
        • 3.3 【哈希表】串联所有单词的子串
        • 3.4 【哈希表】最小覆盖子串
      • 4 矩阵
        • 4.1 【哈希表】有效的数独
        • 4.2 【模拟】螺旋矩阵
        • 4.3 【数学】旋转图像
        • 4.4 【哈希】矩阵置零
        • 4.5 【模拟】生命游戏

2 双指针

2.1 【双指针】验证回文串

题目地址:https://leetcode.cn/problems/valid-palindrome/description/?envType=study-plan-v2&envId=top-interview-150

  详见代码。

class Solution:def isPalindrome(self, s: str) -> bool:newStr = ""s = s.lower()for c in s:if (c >= "a" and c <= "z") or (c >= "0" and c <= "9"):newStr += cleft, right = 0, len(newStr)-1while(left<=right):if newStr[left] != newStr[right]:return Falseleft += 1right -= 1return True
2.2 【双指针】判断子序列

题目地址:https://leetcode.cn/problems/is-subsequence/description/?envType=study-plan-v2&envId=top-interview-150

  双指针挨个遍历 s s s t t t中的字符,看能否找到相对位置一致的字串。

class Solution:def isSubsequence(self, s: str, t: str) -> bool:s_len = len(s)t_len = len(t)s_index = 0if s_len == 0:return Trueif t_len == 0:return Falsefor i in range(t_len):if s_index == s_len:breakif s[s_index] == t[i]:s_index += 1if s_index == s_len:return Trueelse:return False
2.3 【双指针】两数之和 II - 输入有序数组

题目地址:https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/description/?envType=study-plan-v2&envId=top-interview-150

  双指针前后遍历元素,找到合适的值。

class Solution:def twoSum(self, numbers: List[int], target: int) -> List[int]:left, right = 0, len(numbers)-1while(left < right):if numbers[left] + numbers[right] > target:right -= 1elif numbers[left] + numbers[right] < target:left += 1else:breakreturn [left+1,right+1]
2.4 【双指针】盛最多水的容器

题目地址:https://leetcode.cn/problems/container-with-most-water/description/?envType=study-plan-v2&envId=top-interview-150

  木桶原理,水最多取决于左右边界更短的那个边界,所以希望最短边界尽可能长。

class Solution:def maxArea(self, height: List[int]) -> int:left, right = 0, len(height)-1max_water = 0while left < right:tmp_water = min(height[left],height[right])*(right-left)max_water = max(max_water,tmp_water)if height[left] <= height[right]:left += 1else:right -= 1return max_water
2.5 【双指针】三数之和

题目地址:https://leetcode.cn/problems/3sum/description/?envType=study-plan-v2&envId=top-interview-150

  先排序,然后去重,每次固定一个数,在剩下的范围中用双指针找合为0的三元组。

class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:length = len(nums)ans = []if length < 3:return ansnums.sort()for i in range(length):if nums[i] > 0:return ansif i > 0 and nums[i] == nums[i-1]:continueleft = i + 1right = length - 1while left < right:if nums[i] + nums[left] + nums[right] == 0:ans.append([nums[i],nums[left],nums[right]])while left<right and nums[left] == nums[left+1]:left += 1while left<right and nums[right] == nums[right-1]:right -= 1left += 1right -= 1elif nums[i] + nums[left] + nums[right] < 0:left += 1else:right -= 1return ans

3 滑动窗口

3.1 【双指针】长度最小的子数组

题目地址:https://leetcode.cn/problems/minimum-size-subarray-sum/description/?envType=study-plan-v2&envId=top-interview-150

  设置滑动窗口比较窗口内的数字之和与 t a r g e t target target,当满足条件时去掉窗口内首元素,将窗口右移,再次比较。

class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:length = len(nums)slow, fast = 0, 0sum, ans = 0, length+1while fast < length:sum += nums[fast]while sum >= target:ans = min(ans,fast-slow+1)sum -= nums[slow]slow += 1fast += 1return 0 if ans==length+1 else ans
3.2 【滑动窗口】无重复字符的最长子串

题目地址:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=study-plan-v2&envId=top-interview-150

  详见代码。

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:max_len = 0tmp_str = ""length = len(s)i = 0while i < length:if s[i] not in tmp_str:tmp_str += s[i]max_len = max(max_len,len(tmp_str))i += 1else:while s[i] in tmp_str:tmp_str = tmp_str[1:]return max_len
3.3 【哈希表】串联所有单词的子串

题目地址:https://leetcode.cn/problems/substring-with-concatenation-of-all-words/description/?envType=study-plan-v2&envId=top-interview-150

  依次比较每个滑动窗口中单词的出现次数与 w o r d s words words是否一致即可。

class Solution:def findSubstring(self, s: str, words: List[str]) -> List[int]:word_len = len(words[0])word_num = len(words)window = word_len * word_numans = []cnt = {word:0 for word in words}word_cnt = cnt.copy()for word in words:word_cnt[word] += 1start = 0while start < len(s) - window + 1:tmp_cnt = cnt.copy()for i in range(start, start+window, word_len):tmp_word = s[i:i+word_len]if tmp_word in tmp_cnt:tmp_cnt[tmp_word] += 1else:breakif tmp_cnt == word_cnt:ans.append(start)start += 1return ans
3.4 【哈希表】最小覆盖子串

题目地址:https://leetcode.cn/problems/minimum-window-substring/description/?envType=study-plan-v2&envId=top-interview-150

  • 不断增加使滑动窗口增大,直到窗口包含了t的所有元素;
  • 不断增加使滑动窗口缩小,将不必要的元素排除在外,直到碰到一个必须包含的元记录此时滑动窗口的长度,并保存最小值;
  • 再增加一个位置,这个时候滑动窗口肯定不满足条件了,继续从步骤一开始执行,寻找新的满足条件的滑动窗口。
class Solution:def minWindow(self, s: str, t: str) -> str:s_len, t_len, needCnt = len(s), len(t), len(t)need = collections.defaultdict(int)for c in t:need[c] += 1ans = (0,float('inf'))# 增加右边界使滑窗包含ti = 0for j,c in enumerate(s):if need[c] > 0:needCnt -= 1need[c] -= 1# 收缩左边界直到无法再去掉元素if needCnt == 0:while True:ch = s[i]if need[ch] == 0:breakelse:need[ch] += 1i += 1if j-i < ans[1]-ans[0]:ans = (i,j+1)# i多增加一个位置,准备开始下一次循环need[s[i]] += 1needCnt += 1i += 1return ""if ans[1]>s_len else s[ans[0]:ans[1]]

4 矩阵

4.1 【哈希表】有效的数独

题目地址:https://leetcode.cn/problems/valid-sudoku/description/?envType=study-plan-v2&envId=top-interview-150

  将数组分别按照行、列、块构造哈希表,判断是否有重复元素。

class Solution:def isValidSudoku(self, board: List[List[str]]) -> bool:row = [[0] * 9 for _ in range(9)]col = [[0] * 9 for _ in range(9)]block = [[0] * 9 for _ in range(9)]for i in range(9):for j in range(9):if board[i][j] != '.':num = int(board[i][j]) - 1b = (i // 3) * 3 + j // 3if row[i][num] or col[j][num] or block[b][num]:return Falserow[i][num] = col[j][num] = block[b][num] = 1return True
4.2 【模拟】螺旋矩阵

题目地址:https://leetcode.cn/problems/spiral-matrix/description/?envType=study-plan-v2&envId=top-interview-150

  设置上下左右边界,按照从左到右、从上到下、从右到左、从下到上的顺序挨个遍历即可。

class Solution:def spiralOrder(self, matrix: List[List[int]]) -> List[int]:l,r,t,b,res = 0,len(matrix[0])-1,0,len(matrix)-1,[]while True:# left to rightfor i in range(l,r+1):res.append(matrix[t][i])t += 1if t > b:break# top to bottomfor i in range(t,b+1):res.append(matrix[i][r])r -= 1if r < l:break# right to leftfor i in range(r,l-1,-1):res.append(matrix[b][i])b -= 1if b < t:break# bottom to topfor i in range(b,t-1,-1):res.append(matrix[i][l])l += 1if l > r:breakreturn res
4.3 【数学】旋转图像

题目地址:https://leetcode.cn/problems/rotate-image/description/?envType=study-plan-v2&envId=top-interview-150

  主对角线翻转+左右翻转。

class Solution:def rotate(self, matrix: List[List[int]]) -> None:length = len(matrix)# 主对角线for i in range(length):for j in range(i+1,length):matrix[i][j],matrix[j][i] = matrix[j][i],matrix[i][j]# 左右for i in range(length):for j in range(length//2):matrix[i][j],matrix[i][length-j-1] = matrix[i][length-j-1],matrix[i][j]
4.4 【哈希】矩阵置零

题目地址:https://leetcode.cn/problems/set-matrix-zeroes/description/?envType=study-plan-v2&envId=top-interview-150

  首先判断第一行和第一列是否存在零,然后分别用第一行和第一列的空间表示该行或者该列是否存在零,最后统一置零即可。

class Solution:def setZeroes(self, matrix: List[List[int]]) -> None:row = len(matrix)col = len(matrix[0])zero_first = [False,False]# 第一行是否有零for i in range(col):if matrix[0][i] == 0:zero_first[0] = Truebreak# 第一列是否有零for i in range(row):if matrix[i][0] == 0:zero_first[1] = Truebreak# 记录其他行和列的零for i in range(1,row):for j in range(1,col):if matrix[i][j] == 0:matrix[i][0] = matrix[0][j] = 0# 矩阵置零for i in range(1,row):for j in range(1,col):if matrix[i][0] == 0 or matrix[0][j] == 0:matrix[i][j] = 0if zero_first[0] == True:for i in range(col):matrix[0][i] = 0if zero_first[1] == True:for i in range(row):matrix[i][0] = 0
4.5 【模拟】生命游戏

题目地址:https://leetcode.cn/problems/game-of-life/description/?envType=study-plan-v2&envId=top-interview-150

  卷积运算,计算每个细胞的得分。

import numpy as npclass Solution:def gameOfLife(self, board: List[List[int]]) -> None:row,col = len(board),len(board[0])# zero paddingboard_tmp = np.array([[0 for _ in range(col+2)] for _ in range(row+2)])board_tmp[1:row+1,1:col+1] = np.array(board)# kernelkernel = np.array([[1,1,1],[1,0,1],[1,1,1]])# convfor i in range(1,row+1):for j in range(1,col+1):tmp = np.sum(kernel * board_tmp[i-1:i+2,j-1:j+2])if board_tmp[i][j] == 1:if tmp < 2 or tmp > 3:board[i-1][j-1] = 0else:if tmp == 3:board[i-1][j-1] = 1

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

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

相关文章

HTML板块左右排列布局——左侧 DIV 固定宽度,右侧 DIV 自适应宽度,填充满剩余页面

我们可以借助CSS中的 float 属性来实现。 实例&#xff1a; 布局需求&#xff1a; 左侧 DIV 固定宽度&#xff0c;右侧 DIV 自适应宽度&#xff0c;填充满剩余页面。 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta http-e…

介绍如何解决msvcr120.dll丢失问题,msvcp120.dll常见问题的解答

msvcr120.dll是Windows操作系统中的一个重要的动态链接库文件&#xff0c;它包含了许多与C运行库相关的函数。然而&#xff0c;有时用户在运行某些应用程序或游戏时可能会收到"msvcr120.dll丢失"的错误提示。本文将介绍如何解决msvcr120.dll丢失问题&#xff0c;并提…

【c语言】c语言转义字符详解

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;c语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

prometheus基于consul的服务发现

文章目录 一、基础二、安装consul下载地址启动consul访问consul 三、编写服务发现文件nodes.json四、prometheus配置consul发现修改prometheus.yml重启Prometheus 参考 一、基础 二、安装consul 下载地址 https://developer.hashicorp.com/consul/install 启动consul mkdi…

HCIP-MGRE实验配置、PPP的PAP认证与CHAP认证、MGRE、GRE网络搭建、NAT

实验要求 R5为ISP,只能进行IP地址配素&#xff0c;其所有地址均为公有IP地址R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方 R2与R5之间使用PPP的chap认证&#xff0c;R5为主认证方 R3与R5之间使用HDLC封装。R1/R2/R3构建一个MGRE环境&#xff0c;R1为中心站点;R1、R4间为…

Android 13.0 SystemUI下拉状态栏定制二 锁屏页面横竖屏通知栏都居中功能实现

1.前言 在13.0的系统rom定制化开发中,在关于systemui的锁屏页面功能定制中,由于在平板横屏通知栏功能中,通知栏总是显示在右边,并且是在右边居中显示的, 由于需要和竖屏显示一样,所以就需要用到在时钟下面显示通知栏,然后同样需要居中显示通知栏,所以就来分析下相关的…

前端vue金额用逗号分隔

实现效果 代码 template部分 <el-input v-model"state.val"></el-input><div>{{ priceFor(state.val) }}</div> js部分 const state reactive({ val: });const priceFor (val)> {if(!val){return }else if(val.length<4){return…

Z分数标准化

Z分数标准化是一种常用的数据标准化方法&#xff0c;用于将不同数据集的值转换为具有相同比例和零均值、标准差为1的标准正态分布。这种标准化方法对于机器学习和统计分析中的特征缩放和数据预处理非常有用。 标准化的步骤如下&#xff1a; 计算均值和标准差&#xff1a; 对于…

关于电子/硬件试制报告(精简实用版)的一些讨论

TOC 1. 源由 从产品研发的角度&#xff0c;都有最初的工程试制阶段。这个阶段最终一定会有一份试制报告。 当然&#xff0c;整个试制报告涉及方方面面内容。通常电子行业&#xff0c;试制主要是两个方面&#xff1a; 电子/硬件试制&#xff1a;侧重在PCBA等方面结构/机械试…

进程链信任-父进程欺骗

文章目录 前记普通权限的父进程欺骗ShllCode上线进程提权基础进程提权注入 前记 父进程欺骗作用&#xff1a; 进程链信任免杀进程提权 检测&#xff1a; etw 普通权限的父进程欺骗 #include<stdio.h> #include<windows.h> #include <TlHelp32.h>DWORD …

elementui 中el-date-picker 选择年后输出的是Wed Jan 01 2025 00:00:00 GMT+0800 (中国标准时间)

文章目录 问题分析 问题 在使用 el-date-picker 做只选择年份的控制器时&#xff0c;出现如下问题&#xff1a;el-date-picker选择年后输出的是Wed Jan 01 2025 00:00:00 GMT0800 (中国标准时间)&#xff0c;输出了两次如下 分析 在 el-date-picker 中&#xff0c;我们使用…

【51单片机】如何设置中断函数(场景:在定时器工作完跳转到中断程序时,怎么识别我们的中断程序在哪里呢?)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 本章是【利用定时器和中断实现一个简单项目】中的一部分&#xff0c;感兴趣的老铁可以跳转传送门查看传送门 欢迎订阅 YY滴C专栏&#xff01;更多干货…

CI/CD部署

什么是CI&#xff0c;什么是CD CI和CD是软件开发中持续集成和持续交付的缩写。 CI代表持续集成&#xff08;Continuous Integration&#xff09;&#xff0c;是一种实践&#xff0c;旨在通过自动化构建、测试和代码静态分析等过程&#xff0c;频繁地将代码变更合并到共享存储…

前端技巧之svg精灵图svg-sprite-loader

首先说明精灵图的必要性&#xff0c;其可以让我们只需要向服务器请求一次图片资源&#xff0c;就能加载很多图片&#xff0c;即能够减轻http请求造成的服务器压力。 然后这里要说明的是这个插件是webpack上面的&#xff0c;所以在vue2中比较好用&#xff0c;如果在vue3中&…

3DSC特征描述符、对应关系可视化以及ICP配准

一、3DSC特征描述符可视化 C #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/search/kdtree.h> #include <pcl/io/pcd_io.h> #include <pcl/features/normal_3d_omp.h>//使用OMP需要添加的头文件 #include <pcl…

ubuntu制作windows的u盘启动盘

概要&#xff1a; 本篇演示在ubuntu22.04中制作windows10的u盘启动盘 一、下载woeusb 1、下载woeusb 在浏览器中输入https://github.com/woeusb/woeusb/releases访问woeusb 点击红色矩形圈出来的部分&#xff0c;下载woeusb 2、安装wimtools wimtools是woeusb的一个必须的…

windows@按流量计费网络设置@电脑风扇降噪的可能方法

文章目录 按流量计费网络设置流量计费模式下的好处电脑风扇在连结wifi时更容易噪音问题限制软件和系统自动更新行为例:edge不再自动更新 按流量计费网络设置 windows metered connection:Metered connections in Windows - Microsoft Support 打开所连接的网络进行设置,开启me…

项目开发日志(登录界面):2. LoginTitle组件

LoginTitle组件 样式 说明 属性 属性名含义类型是否必填默认值welcomeTitle欢迎标语String是无mainTitle标题String是无 样式 mainColor -> 主题颜色 代码 <template><div class"logintitle-container"><p class"subtitle">{{ welc…

21-k8s中pod的调度-污点和污点容忍

一、污点的概念 所谓的污点&#xff0c;就是给k8s集群中的节点设置的污点&#xff0c;通过设置污点&#xff0c;来规划资源创建时所在的节点&#xff1b; 污点的类型解释说明PreferNoshedule 节点设置这个五点类型后&#xff1b; 表示&#xff0c;该节点接受调度&#xff0c;但…

人工智能技术应用笔记(二):OpenAI SORA文生视频模型技术报告全文中英对照 (GPT4翻译+人工润色)

目录 Video generation models as world simulators&#xff08;视频生成模型作为世界模拟器&#xff09; Turning visual data into patches &#xff08;将视觉数据转换为图像块&#xff09; Video compression network &#xff08;视频压缩网络&#xff09; Spacetim…