31、Next Permutation

题目

这道题目的意思是给定一个序列,找出其按照字典顺序的下一个顺序,如果给定顺序是字典中的最后一个顺序,其下一个顺序则为字典中的第一个顺序。比如:

1,2,3,4,5-----注,后面的顺序去掉逗号

12354

12435

12453

12534

12543

13245

通过上面的例子可以发现规律,在得到13245序列时,其实是从12543的右往左做比较,如果左边比右边数字大,继续往左比较,直到左边数字比右边小,比如12543中,2的右边都是递增的,直到2比5小,因此在543中从右往左找到第一个比2大的数3,交换2,3得到13542,然后将3之后的数字从小到大排序就是所得序列,代码如下:

 class Solution {
public:
void nextPermutation(vector<int>& nums) {
const int size = nums.size();
int temp,left,right;
if(size <= )
return; if( == size)
{
temp = nums[];
nums[] = nums[];
nums[] = temp;
return;
} int index = size--;//从倒数第二个开始 while (index>=)
{
if(nums[index] >= nums[index + ])//等号很重要,比如(5,1,1)的情况
index--;
else
break;
} if(index>=)
{
right = size - ;
while(right > index)
{
if(nums[right] <= nums[index])//等号很重要,比如(5,1,1)的情况
right--;
else
break;
} if(right>index)
{
temp = nums[right];
nums[right] = nums[index];
nums[index] = temp;
}
left = (++index);
}
else
left = ; right = size-; while (left <= right)
{
temp = nums[right];
nums[right] = nums[left];
nums[left] = temp;
left++;
right--;
} }
};

-----------------------------------------------------------------------------------------------------分割线-----------------------------------------------------------------------

32、Longest Valid Parentheses

题目

这道题在具体实现的时候,大家第一反应肯定是要用到stack结构,因为在这种成对匹配的题型中,stack是首选的数据结构。仔细分析题目可得知,题目要求找出最长的合法括号对子串,这道题难点在于需要分析会出现的错误种类,经过分析总结,可以得出如下的错误种类:

1、当遍历到字符串当前字符s[index] ==')'并且stack是空的,也就是说,字符串s从0到index-1的字符都能两两匹对,比如“()()())xxxxx”中,index=6时就是这种情况,针对这种情况,如果我事先已经知道了index之前的字符串中合法子串的最大长度,为max,那么从index+1又可看作是一个新的、从"0"开始处理的字符串s';并且问题规模比之前的s更小了;

2、第二种错误种类不能从当前字符来判断,这种错误类型是这中模式s="--------(----(----",s中多出了两个左括号,其他部分都是刚好匹配的合法串;

通过上面的描述,下面用比较正规的描述一下这几种错误:

a、假设X是左右括号刚好匹配的字符串,比如"()()"、"(())"等,X可以是空串,s'是s的子串,s'也可以是空串;

b、错误模式一:s = “X)s'”;

c、错误模式二:s = “X(s'”;

d、除了这两种类型,没有其他的错误类型了;

有人会问s="X)(s'"是哪一种,其实这种错误时两种错误的结合,拆分为"X)"和"(s‘"即可;

针对错误模式一,只需要保存好X的长度,然后从s’开始下一轮算法执行,而s'是比s规模更小的串;

针对错误模式二,需要比较s'的最长合法子串和X的长度,然后进行比较,比如s="--------(----(----",我只需要在栈中保存好这两个多余的左括号的下标,然后从字符串的末尾开始,从栈中弹出栈顶下标(其实就是s中第二个多余字符的下标)index,end-index就是合法字符串的长度,及第二个左括号右边那部分的长度,接着end赋值为index-1,重复如此计算得到最后的结果;

代码如下:

 class Solution {
public:
int longestValidParentheses(string s) {
if(""==s)
return ;
stack<int> myStack;
int index = ;
int res=;
int start=,end;
int temp; while (s[index]!='\0')
{
if('(' == s[index])
{
myStack.push(index);
}
else
{
if(myStack.empty())//错误模式一
{
if(index - start > res)
res = index - start;
start = index+;
}
else
{
myStack.pop();
}
}
index++;
}
end =index-;
if(myStack.empty())
{
if(end - start+ > res )
res = end -start+; return res;
}
while(!myStack.empty())
{
temp = myStack.top();
myStack.pop();
if(end - temp > res)
res = end -temp; end = temp-;
} if(end - start+ > res)
res = end -start+;
return res;
}
};

Leetcode题解(十一)的更多相关文章

  1. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...

  2. leetcode题解-122买卖股票的最佳时期

    题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...

  3. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  4. 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)

    目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...

  5. 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)

    目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...

  6. 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)

    目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...

  7. 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...

  8. 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...

  9. 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)

    目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...

  10. 【LeetCode题解】19_删除链表的倒数第N个节点(Remove-Nth-Node-From-End-of-List)

    目录 描述 解法:双指针 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以访问我的 github. 描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回 ...

随机推荐

  1. 【JavaScript】设计模式-module模式及其改进

    写在前面 编写易于维护的代码,其中最重要的方面就是能够找到代码中重复出现的主题并优化他们,这也是设计模式最有价值的地方 说到这里...... <head first设计模式>里有一篇文章, ...

  2. 《MATLAB从入门到放弃》二维曲线和图形绘制基础(一): 什么是图形对象和句柄 ?

    图形对象 一个图形包含了不同的对象 图形包括 核心对象和绘制对象 .  核心对象 线条对象 : line 文本对象 : text 矩形对象 : rectangle 补丁对象 : patch 图像对象  ...

  3. HTML 简述

    1.本页超链接 <a href="#t">查看 Chapter 4.</a> <a name="t">Test</a& ...

  4. NOIP2017SummerTraining0717

    个人感受:自己水平是真的差劲,和他们不是一个档次的,第二题,如果不是陈载元暴力过了,我也不会那么早去A了第二题,第一题真的是无语,以前做到过,还想到了每个对应值a[i]-i,但是没想出来,真的是 可惜 ...

  5. 渣渣学QT

    初学QT,自己的一些小总结,错误之处,望大神指点一二: 1,添加资源文件时想应用在界面的背景,但是发现用不了,后来才知道是没有"构建"?应该是要在构建之后才将所添加的资源文件真正的 ...

  6. 管中窥豹——从OVS看SDN

    网络虚拟化是当前云计算最重要的特点之一,打通租户网络之间互通以及访问控制策略,最重要的是满足租户之间的网络隔离,这才是云计算网络的特点.而SDN的产生则是在网络虚拟化中,将控制面和业务面分离,控制面只 ...

  7. FPGA与安防领域

    安防主要包括:闭路监控系统.防盗报警系统.楼宇对讲系统.停车厂管理系统.小区一卡通系统.红外周界报警系统.电子围栏.巡更系统.考勤门禁系统.安防机房系统.电子考场系统.智能门锁等等. 在监控系统中,F ...

  8. DSCP 与IP 优先级IP优先级

    在IPv4的报文头中,TOS字段是1字节,如下图所示.根据RFC1122的定义,IP优先级(IPPrecedence)使用最高3比特(第0-2比特).+++++++++++++++++++++++++ ...

  9. zoj 2136 Longest Ordered Subsequence 最长上升子序列 新思路

    Longest Ordered Subsequence Time Limit: 2 Seconds      Memory Limit: 65536 KB A numeric sequence of ...

  10. SQL SERVER 数据库级联删除

    --SQL SERVER 2008R2 级联删除:主子表设置外键关联,当主表数据删除的时候会自动删除子表中对应的数据 --创建主表 create table test_main( ID ,) PRIM ...