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;}
}

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

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

相关文章

虚拟现实--->unity学习

前言&#xff1a;这学期劳动课选了虚拟现实&#xff0c;其中老师算挺认真的&#xff0c;当然对一些不感兴趣的同学来说是一种折磨&#xff0c;我对这个unity的学习以及后续的虚幻引擎刚开始连基础的概念都没有&#xff0c;后面渐渐也是滋生了一些兴趣&#xff0c;用这篇博客记录…

在Trae中设置Python解释器版本

Python 是一种广泛使用的高级编程语言&#xff0c;因其简洁易读的语法和强大的功能而备受欢迎。随着 Python 的不断发展&#xff0c;多个版本相继发布&#xff0c;每个版本都带来了新特性和改进。然而&#xff0c;这也带来了一些问题&#xff0c;比如不同的工程&#xff0c;需要…

鸿蒙原生开发之状态管理V2

一、ArkTS状态变量的定义&#xff1a; State&#xff1a;状态&#xff0c;指驱动UI更新的数据。用户通过触发组件的事件方法&#xff0c;改变状态数据。状态数据的改变&#xff0c;引起UI的重新渲染。 在鸿蒙原生开发中&#xff0c;使用ArkTS开发UI的时候&#xff0c;我们可以…

nginx配置跳转设置Host有误导致报404问题

我们有个项目&#xff0c;前端调用了第三方接口。为了避免跨域&#xff0c;所以使用nginx进行转发。一直正常工作&#xff0c;相安无事。近日第三方调整了安全策略&#xff0c;http转换成https&#xff0c;原本使用ip&#xff0c;现在也改成使用域名&#xff0c;所以nginx这里我…

深度学习 Deep Learning 第12章 深度学习的主流应用

深度学习 Deep Learning 第12章 深度学习的主流应用 内容概要 本周深入探讨了深度学习在多个领域的应用&#xff0c;包括计算机视觉、语音识别、自然语言处理以及其他领域如推荐系统和知识表示。本章强调了硬件和软件基础设施的重要性&#xff0c;特别是GPU在加速神经网络训练…

【Qt】三种操作sqlite3的方式及其三种多表连接

一、sqlite3与MySQL数据库区别&#xff1a; 1. 数据库类型 SQLite3&#xff1a;是嵌入式数据库&#xff0c;它将整个数据库存储在单个文件中&#xff0c;不需要独立的服务器进程。这意味着它可以很方便地集成到各种应用程序中&#xff0c;如移动应用、桌面应用等。MySQL&…

mysqlworkbench导入.sql文件

1、MySQL Workbench 新建数据库 或者 在左侧导航栏的 ​Schemas 区域右键选择 ​Create Schema...输入数据库名称&#xff08;例如 mydatabase&#xff09;&#xff0c;点击 ​Apply确认创建&#xff0c;点击 ​Finish 2、选择目标数据库 在左侧导航栏的 ​Schemas 列表中&a…

《Spring Cloud Eureka 高可用集群实战:从零构建高可靠性的微服务注册中心》

从零构建高可用 Eureka 集群 | Spring Cloud 微服务架构深度实践指南 本文核心内容基于《Spring Cloud 微服务架构开发》第1版整理&#xff0c;结合生产级实践经验优化 实验环境&#xff1a;IntelliJ IDEA 2024 | JDK 1.8| Spring Boot 2.1.7.RELEASE | Spring Cloud Greenwich…

实变函数:集合与子集合一例(20250329)

题目 设 r , s , t r, s, t r,s,t 是三个互不相同的数&#xff0c;且 A { r , s , t } A \{r, s, t\} A{r,s,t}, B { r 2 , s 2 , t 2 } B \{r^2, s^2, t^2\} B{r2,s2,t2}, C { r s , s t , r t } C \{rs, st, rt\} C{rs,st,rt} 若 A B C A B C ABC 则 { r , s…

Redis设计与实现-哨兵

哨兵模式 1、启动并初始化sentinel1.1 初始化服务器1.2 使用Sentinel代码1.3 初始化sentinel状态1.4 初始化sentinel状态的master属性1.5 创建连向主服务器的网络连接 2、获取主服务器信息3、获取从服务器的信息4、向主从服务器发送信息5、接受主从服务器的频道信息6、检测主观…

蓝桥杯省模拟赛 字符串拼接

问题描述 给定四个字符串 a,b,c,d&#xff0c;请将这四个字符串按照任意顺序依次连接拼成一个字符串。 请问拼成的字符串字典序最小是多少&#xff1f; 输入格式 输入四行&#xff0c;每行包含一个字符串。 输出格式 输出一行包含一个字符串&#xff0c;表示答案。 样例…

【大前端系列20】JavaScript核心:项目实战从零构建任务管理系统

JavaScript核心&#xff1a;项目实战从零构建任务管理系统 系列: 「全栈进化&#xff1a;大前端开发完全指南」系列第20篇 核心: 将JavaScript异步编程、事件循环等核心知识应用于实际项目开发 &#x1f4cc; 引言 在前面的文章中&#xff0c;我们深入探讨了JavaScript中的异步…

STM32单片机的桌面宠物机器人(基于HAL库)

效果 基于STM32单片机的桌面宠物机器人 概要 语音模块&#xff1a;ASR PRO&#xff0c;通过天问block软件烧录语音指令 主控芯片&#xff1a;STM32F103C8T6 使用HAL库 屏幕&#xff1a;0.96寸OLED屏&#xff0c;用来显示表情 4个舵机&#xff0c;用来当作四只腿 底部一个面…

计算机视觉初步(环境搭建)

1.anaconda 建议安装在D盘&#xff0c;官网正常安装即可&#xff0c;一般可以安装windows版本 安装成功后&#xff0c;可以在电脑应用里找到&#xff1a; 2.创建虚拟环境 打开anaconda prompt&#xff0c; 可以用conda env list 查看现有的环境&#xff0c;一般打开默认bas…

SQL Server数据库引擎服务启动失败:端口冲突

问题现象&#xff1a; SQL Server 2022 安装完成后&#xff0c;数据库引擎服务无法启动&#xff0c;日志报错 “TCP 端口 1433 已被占用”&#xff08;ERROR_LOG_SYS_TCP_PORT&#xff09;。 快速诊断 检测端口占用&#xff1a; # 查看 1433 端口占用情况&#xff08;需管理员权…

全局思维与系统思考

最近接到一些需求&#xff0c;1号位希望每个层级的领导者有眼界&#xff0c;胸怀&#xff0c;格局&#xff0c;全局观&#xff0c;这些听起来似乎很抽象&#xff0c;然而它们是每个人、每个团队成长与成功的核心竞争力。那么&#xff0c;如何才能提升这些能力&#xff1f;就像我…

区间有关的贪心解题记录435无重叠区间452用最少数量的箭引爆气球

无重叠区间我的想法是开一个数组a&#xff0c;遍历给出的区间&#xff0c;在数组a里将对应落在的区间index标记。如果有重复区间就只选择最小的那个区间标记。但是这道题的区间好像很长-5 * 104 < starti < endi < 5 * 104没法用数组a表示总的区间范围。 核心思路是当…

天锐蓝盾终端安全防护——企业终端设备安全管控

从办公室的台式电脑到员工手中的移动终端&#xff0c;这些设备不仅是工作的得力助手&#xff0c;更是企业数据的重要载体。然而&#xff0c;随着终端设备的广泛使用&#xff0c;安全风险也如影随形。硬件设备使用不当、数据随意传输等问题频发&#xff0c;使得企业数据面临着泄…

k8s网络策略

k8s网络策略 k8s网络测试概述查看防火墙策略 k8s网络策略网络访问控制案例&#xff1a;配置k8s网络策略结果验证 k8s网络策略配置示例 k8s网络测试概述 网络策略就是设置防火墙 查看防火墙策略 # 获取当前命名空间下的所有 NetworkPolicy 资源&#xff08;网络策略&#xff0…

leetcode刷题日记——跳跃游戏 II

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 题目要求在一个一定能达到数组末尾的跳跃数组中(见55题 跳跃游戏)&#xff0c;找出能够跳到末尾的最小次数要求次数最少&#xff0c;那肯定是选取能选步数中最大的数。也就是在当前能够达到的距离中&#xff0c;选择能够达到的…