当前位置: 首页 > article >正文

LeetCode 第31~33题

目录

LeetCode 第31题:下一个排列

 LeetCode 第32题:最长有效括号

LeetCode 第33题:搜索旋转排序数组

LeetCode 第31题:下一个排列

题目描述

整数数组的一个排列就是将所有成员以序列或线性顺序排列。例如arr=[1,2,3],以下这些都可以视作arr的排列:[1,2,3],[1,3,2],[3,1,2],[2,3,1]。整数数组的下一个排列是指整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的下一个排列就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典最小的排列(即,其元素按升序排列)。

难度:中等

题目链接:31. 下一个排列 - 力扣(LeetCode)

示例1:

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

 示例2:

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

示例3:

输入:nums = [1,1,5]
输出:[1,5,1]

提示:

  • 1<=nums.length<=100
  • 0<=nums[i]<=100

解题思路:字典序
关键点:

  • 从右向左找第一个升序对
  • 从右向左找第一个大于nums[i]的数
  • 交换并反转后续数字

具体步骤:

  • 从右向左找第一个升序对(i,i+1),找到第一个nums[i]<nums[i+1]的位置,此位置就是需要改变的位置。
  • 从右向左找第一个大于nums[i]的数,在i右侧找第一个大于nums[i]的数,与nums[i]交换。
  • 反转i+1后的所有数字,因为i+1后的数字是降序的,反转后得到升序。 
public class Solution
{public void NextPermutation(int[] nums){int i=nums.Length-2;//找到第一个升序对while(i>=0 && nums[i]>=nums[i+1])i--;if(i>=0){int j=nums.Length-1;//找到第一个大于nums[i]的数while(j>=0 && nums[j]<=nums[i])j--;Swap(nums,i,j);}Reverse(nums,i+1);//反转i+1之后的数字}private void Swap(int[] nums,int i ,int j){int temp=nums[i];nums[i]=nums[j];nums[j]=temp;}private void Reverse(int[] nums,int start){int left = start,right=nums.Length-1;while(left<right){Swap(nums,left,right);left++;right--;}}
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

 LeetCode 第32题:最长有效括号

题目描述:
给你一个只包含‘(’和‘)’的字符串,找出最长有效(格式正确且连续)括号子串的长度。

难度:困难
题目链接:32. 最长有效括号 - 力扣(LeetCode)

示例1:

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"

 示例2:

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"

示例3:

输入:s = ""
输出:0

提示:

  • 0<=s.length<=3*104
  • s[i]为‘(’或‘)’

解题思路:

方法一:动态规划

关键点:

  • 当s[i]为‘(’时,dp[i]=0,因为不可能以左括号结尾
  • 当s[i]为‘)’时,需要考虑两种情况:
    s[i-1]为‘(’,dp[i]=dp[i-2]+2;s[i-1]为‘)’检查dp[i-1]前面的字符是否是‘(’
public class Solution
{public int LongestValidParentheses(string s){if(strlen(s)==0) return 0;int maxLen=0,n=strlen(s);int dp[n];for(int i=0;i<n;i++){if(s[i]==')'){if(s[i-1]=='(')  dp[i]=(i>=2 ? dp[i-2]:0)+2;else if(i-dp[i-1]>0 && s[i-dp[i-1]-1]=='(')dp[i] = dp[i-1]+2+(i-dp[i-1]>=2 ? dp[i-dp[i-1]-2]:0);maxLen = Math.Max(maxLen,dp[i]);}}return maxLen;}
}

方法二:双向扫描法

  • 从左到右扫描,统计左右括号数量
  • 从右向左再次扫描,取两次扫描的最大值
public class Solution
{public int LongestVaildParentheses(string s){int manLen=0,left=0,right=0;//从左向右扫描for(int i=0;i<s.Length;i++){if(s[i]=='(') left++;else right++;if(left==right)  maxLen=Math.Max(maxLen,2*right);else if(right>left)  left=right=0;}//从右到左扫描left=right=0;for(int i=s.Length-1;i>=0;i--){if(s[i]=='(') left++;else right++;if(left==right)  maxLen=Math.Max(maxLen,2*left)else if(left>right)  left=right=0;}return maxLen;}
}

方法三:栈

  • 使用栈存储左括号的下标
  • 遇到右括号时尝试匹配
  • 通过下标差计算长度
public class Solution
{public int LongestVaildParentheses(string s){int maxLen=0,n=strlen(s);int stack[n+1];stack.Push(-1);for(int i=0;i<s.Length;i++){if(s[i]=='(')  stack.Push(i);else {stack.Pop();if(stack.Count==0)  stack.Push(i);else maxLen=fmax(maxLen,i-stack[top]);//返回栈顶的元素但不移除它}}return manLen;    
}
}

LeetCode 第33题:搜索旋转排序数组

题目描述

整数数组nums按升序排列,数组中的值互不相同。

在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为【nums[k],nums[k+1],........nums[n-1],nums[0],nums[1],.......nums[k-1]】(下标从0开始计数)。例如【0,1,2,4,5,6,7】在下标3处经旋转后可能变为【4,5,6,7,0,1,2】。

给你一个旋转后的数组nums和一个整数target,如果nums中存在这个目标值target,则返回它的下标,否则返回-1。你必须设计一个时间复杂度为O(log n)的算法来解决此问题。

难度:中等

题目链接: 33. 搜索旋转排序数组 - 力扣(LeetCode)

示例1:

输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4

 示例2:

输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1

示例3:

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

提示:

  • 1<=nums.length<=5000
  • -104<=nums[i]<=104
  • nums中的每个值都独一无二
  • 题目数据保证nums在预先未知的某个下标上进行了旋转
  • -104<=target<=104

解题思路:二分查找

public class Solution
{public int Serach(int nums[],int target){if(nums==null || nums.length==0) return -1;int left=0,right=nums.length-1;while(left<=right){int mid= left+right>>1;if(nums[mid]==target)  return mid;if(nums[left]<=nums[mid])//判断有序部分,二分查找仅限于有序数列中//判断target是否在有序部分中,如果在缩小范围到有序部分,否则搜索另一半{if(target>=nums[left] && target<nums[mid]) right=mid-1;else left = mid+1;}else{if(target>nums[mid] && target<=nums[right+1]) left=mid+1;else right = mid-1;}}return -1;}
}

相关文章:

LeetCode 第31~33题

目录 LeetCode 第31题&#xff1a;下一个排列 LeetCode 第32题&#xff1a;最长有效括号 LeetCode 第33题&#xff1a;搜索旋转排序数组 LeetCode 第31题&#xff1a;下一个排列 题目描述 整数数组的一个排列就是将所有成员以序列或线性顺序排列。例如arr[1,2,3]&#xff0c;以…...

【NLP 44、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】

目录 数据文件 一、模型定义 1.模型初始化 代码运行流程 2.前向传播&#xff0c;计算损失 ⭐ 代码运行流程 二、加载语料 代码运行流程 三、 随机生成样本 代码运行流程 四、建立模型 五、采样策略选择 代码运行流程 六、模型效果测试 代码运行流程 七、模型训练 代码运行流程 …...

Go 语言规范学习(1)

文章目录 IntroductionNotation示例&#xff08;Go 语言的 if 语句&#xff09;&#xff1a; Source code representationCharacters例子&#xff1a;变量名可以是中文 Letters and digits Lexical elementsCommentsTokensSemicolons例子&#xff1a;查看程序所有的token Ident…...

ShapeCrawler:.NET开发者的PPTX操控魔法

引言 在当今的软件开发领域&#xff0c;随着数据可视化和信息展示需求的不断增长&#xff0c;处理 PPTX 文件的场景日益频繁。无论是自动化生成报告、批量制作演示文稿&#xff0c;还是对现有 PPT 进行内容更新与格式调整&#xff0c;开发者都需要高效的工具来完成这些任务。传…...

微信小程序如何接入直播功能

一、小程序直播开通背景 1.政府资质要求 政府的要求&#xff0c;小程序开通直播需要注册主体具备互联网直播的资质&#xff0c;普通企业需要《信息网络传播视听节目许可证》&#xff0c;表演性质的直播需要《网络文化经营许可证》&#xff0c;政府主体需要《社会信用代码》及…...

ArrayList<E>案例//定义一个方法,将价格低于3000的手机信息返回

import java.util.ArrayList;public class ArrayListphone {public static void main(String[] args){//定义一个方法&#xff0c;将价格低于3000的手机信息返回Phone p1new Phone("小米",1000);Phone p2new Phone("苹果",8000);Phone p3new Phone("锤…...

基于Spring Boot的停车场管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

慧通测控汽车智能座舱测试技术

一、引言 随着科技的飞速发展&#xff0c;汽车正从单纯的交通工具向智能化移动空间转变。智能座舱作为这一转变的核心体现&#xff0c;融合了多种先进技术&#xff0c;为用户带来前所未有的驾驶体验。从简单的信息娱乐系统到高度集成的人机交互、智能驾驶辅助以及车辆状态监测…...

Qt进程间通信:QSharedMemory 使用详解

1. 什么是 QSharedMemory&#xff1f; QSharedMemory 是 Qt 中用于进程间共享内存的类。它允许多个进程共享一块内存区域&#xff0c;从而避免数据传输时的 IO 操作&#xff0c;提高通信速度。通过共享内存&#xff0c;多个进程可以直接读写这块内存&#xff0c;而无需经过文件…...

kettle插件-rabbitmq插件

场景&#xff1a;kettle本身可以直接链接rabbitmq&#xff0c;但是需要配置rabbitmq开启mqtt协议&#xff0c;本次讲解下自定义开发组件RabbitMQ consumer&#xff0c;无需开启mqtt协议即可使用。 1、docker 安装rabbitmq 1&#xff09;下载镜像 docker pull rabbitmq 2&…...

为Windows10的WSL Ubuntu启动sshd服务并使用Trae远程连接

Windows10的WSL Ubuntu&#xff0c;使用起来非常方便&#xff0c;但是美中不足的是&#xff0c;无法从Windows主机ssh到Ubuntu 。 解决的方法是在Ubuntu安装sshd服务 Ubuntu安装sshd服务 执行命令 sudo apt install openssh-server 安装好后&#xff0c;先本地测试&#x…...

【C#.NET】VS2022创建Web API项目

C# Web API 是一种基于 .NET 平台&#xff08;包括但不限于.NET Framework 和 .NET Core&#xff09;构建 HTTP 服务的框架&#xff0c;用于创建 RESTful Web 服务。REST&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;它利用HTTP协议…...

体育直播系统趣猜功能开发技术实现方案

功能概述 趣猜功能是“东莞梦幻网络科技”体育直播系统源码中的互动功能&#xff0c;主播可以发起竞猜题目&#xff0c;观众使用虚拟货币进行投注&#xff0c;增加直播间的互动性和趣味性。所有货币均为虚拟货币&#xff0c;通过系统活动获取&#xff0c;不可充值提现。 数据…...

33.[前端开发-JavaScript基础]Day10-常见事件-鼠标事件-键盘事件-定时器-案例

1 window定时器 window定时器方法 setTimeout的使用 setInterval的使用 2 轮播消息提示 案例实战一 – 轮播消息提示 3 关闭隐藏消息 案例实战二 – 关闭隐藏消息 4 侧边栏展示 案例实战三 – 侧边栏展示 5 tab切换实现 案例实战四 – 登录框&#xff08;作业&#xff09;…...

C# 多标签浏览器 谷歌内核Csharp

采用框架 &#xff1a;FBrowserCEF3lib 视频演示&#xff1a;点我直达 成品下载&#xff1a; https://wwms.lanzouo.com/iYOd42rl8vje...

如何同步fork的更新

当你fork了一个代码仓库后&#xff0c;要将其与原始源码保持同步&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 添加原始仓库作为远程源 在本地命令行中&#xff0c;进入到你fork后的代码仓库目录&#xff0c;然后使用以下命令添加原始仓库&#xff08;通常称为upstr…...

如何从0设计开发一款JS-SDK

一、前言 前端SDK是什么&#xff1f;前端SDK是为了帮助前端实现特定需求&#xff0c;而向开发者暴露的一些JS-API的集合&#xff0c;规范的SDK包括若干API实现、说明文档等 前端SDK其实很常见了&#xff0c;比如&#xff1a; UI组件库&#xff1a;通过封装一系列组件&#xff…...

linux实现rsync+sersync实时数据备份

1.概述 rsync(Remote Sync) 是一个Unix/linux系统下的文件同步和传输工具 2.端口和运行模式 tcp/873 采用C/S模式&#xff08;客户端/服务器模式&#xff09; 3.特点 可以镜像保存整个目录和文件第一次全量备份(备份全部的文件),之后是增量备份(只备份变化的文件) 4. 数…...

【计算机网络】计算机网络协议、接口与服务全面解析——结合生活化案例与图文详解

协议、接口与服务 导读一、协议1.1 定义1.2 组成 二、接口三、服务3.1 定义3.2 服务与协议的区别3.3 分类3.3.1 面向连接服务于无连接服务3.3.2 可靠服务和不可靠服务3.3.3 有应答服务和无应答服务 结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;…...

51c自动驾驶~合集26

我自己的原文哦~ https://blog.51cto.com/whaosoft/11968755 #大模型/Sora/世界模型之间是什么关系 1 什么是大模型 人工智能大模型&#xff08;Artificial Intelligence Large Model&#xff0c;简称AI大模型&#xff09;是指具有庞大的参数规模和复杂程度的机器学习模…...

【汽车传感系统架构:借助传感获取安全】

为了将车辆自动化提升到一个新的水平&#xff0c;设计人员研究了 LiDAR 等传感器选项的权衡&#xff0c;并着眼于传感系统架构。 本文引用地址&#xff1a;https://www.eepw.com.cn/article/202503/468584.htm 每年&#xff0c;约有 120 万人死于道路交通事故&#xff0c;还有…...

【NUUO 摄像头】(弱口令登录漏洞)

漏洞简介&#xff1a;NUUO 是NUUO公司的一款小型网络硬盘录像机设备。 NUUO NVRMini2 3.0.8及之前版本中存在后门调试文件。远程攻击者可通过向后门文件handle_site_config.php发送特定的请求利用该漏洞执行任意命令。 1.Fofa搜索语句&#xff1a; 在Fofa网站&#xff0c;搜索&…...

论文阅读笔记:Denoising Diffusion Probabilistic Models (3)

论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (1) 论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (2) 论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (3) 4、损失函数逐项分析 可以看出 L L L总共分为了3项…...

【设计模式】抽象工厂模式(含与工厂方法模式的对比)

本期我们来学习一下设计模式之抽象工厂模式&#xff0c;在软件开发中&#xff0c;工厂模式 和 抽象工厂模式 都用于创建对象&#xff0c;但它们的应用场景和实现方式有所不同。本文将基于 C 代码&#xff0c;分析抽象工厂模式的实现&#xff0c;并对比其与工厂方法模式的区别。…...

消息队列保证最终一致性的优势

消息队列保证最终一致性的优势 使用消息队列&#xff08;如Kafka、RabbitMQ等&#xff09;来实现MySQL和Redis之间的最终一致性&#xff0c;具有以下几个显著优势&#xff1a; 1. 解耦系统组件 降低系统耦合度&#xff1a;生产者&#xff08;MySQL更新&#xff09;和消费者&…...

IDEA转战Trae AI IED配置

Trae Ai 的前身是vscode IDEA转战Trae AI IED配置 1.安装java相关的插件 2、安装spring相关的插件 3.配置maven环境 打开 Trae AI IDE -> 首选项 -> 设置 -> Editor 设置 ⚠️配置方式有两种 setting.json文件中直接编辑&#xff08;推荐&#xff09;界面设置 方案…...

再学:区块链基础与合约初探 EVM与GAS机制

目录 1.区块链是什么 2.remix ​3.账户​ ​4.以太坊三种交易​ 5.EVM 6.以太坊客户端节点 ​7.Gas费用 8.区块链浏览器 1.区块链是什么 只需要检验根节点 Merkel根是否有更改&#xff0c;就不用检查每个交易是否有更改。方便很多。 2.remix 3.账户 如果交易失败的话&…...

Nextjs15 - middleware的使用

nextjs 官方文档&#xff08;current branch 对应如下文档&#xff09; Middlewarepath-to-regexp 本专栏内容均可在Github&#xff1a;test_05/Middleware 找到 一、middleware 基本使用 中间件允许您在请求完成之前运行代码。然后&#xff0c;根据传入的请求&#xff0c;您…...

PHP If...Else 语句详解

PHP If...Else 语句详解 引言 PHP 是一种流行的服务器端脚本语言&#xff0c;常用于开发动态网站和应用程序。在 PHP 编程中&#xff0c;条件语句是编程逻辑的基础&#xff0c;其中 if...else 语句是最基本且最常用的条件语句之一。本文将详细介绍 PHP 的 if...else 语句&…...

Django之旅:第六节--mysql数据库操作增删改查(二)

前提条件(models.py已经设置好&#xff09;&#xff1a; from django.db import mmodelsclass UserInfo(models.Model):namemodels.CharFIeld(max_length32)passwordmodels.CharFIeld(max_length64)#agemodels.IntegerFIeld()操作数据语法&#xff08;在views.py文件&#xff0…...