[leetcode]Next Greater Element
第一题:寻找子集合中每个元素在原集合中右边第一个比它大的数。
想到了用哈希表存这个数的位置,但是没有想到可以直接用哈希表存next great,用栈存还没找到的数,没遍历一个数就考察栈中的元素小,小的话,这个数就是栈中数的next great,栈中的数肯定是下大上小。
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
/*
通过map建立当前元素和其next great的映射
在建立映射时,用栈记录还没有映射(就是还没有找到next great)的数,每新遍历一个数,就考察栈顶元素能不能映射,能就
建立映射,弹出栈顶,并继续考察新栈顶。不能建立后,压入该数。
一开始不明白,会不会有下边小,上边大的情况,如果有这种情况的话,下边的数是建立不了映射的,但是想了想是不可能出现的,
因为每当有大的数的时候,小的会被弹出,大的会压入,所以栈顶是最小的数。
*/
Stack<Integer> st = new Stack<>();
Map<Integer,Integer> map = new HashMap<>();
int[] res = new int[nums1.length];
for (int num :
nums2) {
while (!st.isEmpty() && st.peek() < num)
{
map.put(st.peek(),num);
st.pop();
}
st.push(num);
}
for (int i = 0; i < res.length; i++) {
res[i] = map.getOrDefault(nums1[i],-1);
}
return res;
}
第二题:和第一题的不同点是这次是求一个循环数列中各个元素的next,而且可能有重复
循环的解决方法是遍历两轮,每次下标对n取余,这样两轮的下标就相同了
重复的解决方法是stack记录下标,而不是记录数据,每次有了next,直接存到res的相应位置
最后的res就相当于一个哈希表
public int[] nextGreaterElements2(int[] nums) {
/*
相对第一题的改变时数组成了循环数组,遍历到最后一个数之后可以再从第一个数开始
自己想的方案是暴力解,两层for
看了答案,这种循环数组遍历,下标的问题是用取余的方法,第二遍第1个数,相当于n+1个数,n+1%n = 1,正好是第一个数
以后遇上循环数组,就遍历两倍长度,%n取余后,两次遍历的下标就一样了
*/
int l = nums.length;
int[] res = new int[l];
//有的找不到,直接初始化数组为-1
Arrays.fill(res,-1);
Stack<Integer> st = new Stack<>();
//循环数组,遍历两倍长度的数组,每次都取余,这样每个元素都可以把它前后的元素都遍历到,对于第二轮遍历下标不对应的解决方法是
//取余,对n取余,下表就对应了。时间复杂度O(2n)
//还要考虑这次有重复,所以不能记录数,要记录下标
for (int i = 0; i < 2*l; i++) {
int num = nums[i%l];
while (!st.isEmpty() && nums[st.peek()] < num)
{
res[st.peek()] = num;
st.pop();
}
//只在第一轮遍历时记录下标
if (i<l) st.push(i);
}
return res;
}
第三题:找全排列的下一个数,之前做过,但是没做出来,f**k
public int nextGreaterElement3(int n) {
/*
没做出来
策略是:如果从第K为到末尾是递减的,且第k位大于第K-1位(也就是递减序列最高位是k),那么就倒序排列递减序列,并且找到
比k-1为大的那个最小数,交换位置
之前做过一个题,找全排列的下一个数,和这个一模一样
*/
String str = n+"";
int l = str.length();
if (l == 1)
return -1;
//注意这里k的初始值不是0,是l-1。因为是倒着开始判断,如果没有判断到则k不会改变,递减数列应该是从l-1开始,也就是最后一个数
int k = l-1;
//处理成数列好操作,StringBuilder也可以
char[] ch = str.toCharArray();
//找到递减数列开始的地方
for (int i = l-2; i >=0; i--) {
if (ch[i] < ch[i+1])
{
k = i+1;
break;
}
}
//翻转递减数列,这里也可以转为字符串用string自带的翻转
for (int i = k; i < k+(l-k)/2; i++) {
char temp = ch[i];
ch[i] = ch[l-1-(i-k)];
ch[l-1-(i-k)] = temp;
}
//更换位置
for (int i = k; i < l; i++) {
if (ch[i] > ch[k-1])
{
char temp = ch[i];
ch[i] = ch[k-1];
ch[k-1] = temp;
break;
}
}
String res = new String(ch);
//判断是不是超过了int最大值
Long a = Long.parseLong(res);
if (a >Integer.MAX_VALUE)
return -1;
int b = Integer.parseInt(res);
//如果数没有改变说明这个数是全排列中最大的数,没有下一个,输出-1,要判断一下
if (b == n)
return -1;
return b;
}
[leetcode]Next Greater Element的更多相关文章
- LeetCode——Next Greater Element I
LeetCode--Next Greater Element I Question You are given two arrays (without duplicates) nums1 and nu ...
- [LeetCode] Next Greater Element III 下一个较大的元素之三
Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...
- [LeetCode] Next Greater Element II 下一个较大的元素之二
Given a circular array (the next element of the last element is the first element of the array), pri ...
- [LeetCode] Next Greater Element I 下一个较大的元素之一
You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset of n ...
- LeetCode Next Greater Element III
原题链接在这里:https://leetcode.com/problems/next-greater-element-iii/description/ 题目: Given a positive 32- ...
- LeetCode: Next Greater Element I
stack和map用好就行 public class Solution { public int[] nextGreaterElement(int[] findNums, int[] nums) { ...
- [LeetCode] 496. Next Greater Element I 下一个较大的元素 I
You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset of n ...
- [LeetCode] 503. Next Greater Element II 下一个较大的元素 II
Given a circular array (the next element of the last element is the first element of the array), pri ...
- [LeetCode] 556. Next Greater Element III 下一个较大的元素 III
Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...
随机推荐
- spring-boot-starter
Spring Boot Starter 是在 SpringBoot 组件中被提出来的一种概念,stackoverflow 上面已经有人概括了这个 starter 是什么东西,想看完整的回答戳 这里. ...
- sql中count(1)、count(*)与count(列名)的区别
1. count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了!从执行计划来看,count(1)和count(*)的效果是 ...
- .Net编码规范整理
前言 此处只是整理并记录下.Net开发规范以便加深编码规范.一个好的编程规范可以让自己程序可读性,让自己编码更规范,分为两部分:通用规范..Net开发规范. 微软通用编程规范 明确性和一致性 库的使用 ...
- linux下的bash shell
运行bash shell命令的方式 vi t1.sh 并输入 pwd ls pwd 然后:x保存关闭 1.首先查看权限 ls -l,如果没有执行权限则用chmod a+x t1.sh ,最后运行./t ...
- 第11.14节 正则表达式转义符和Python转义符相同引发问题的解决办法
正则表达式使用反斜杠('\')来把特殊字符转义成普通字符(为了方便称为"正则表达式转义"),而反斜杠在普通的 Python 字符串里也是转义符(称为"字符串转义" ...
- 【软件测试部署基础】npm的认识
1. npm简介 先来看下官方介绍: npm makes it easy for JavaScript developers to share and reuse code, and it makes ...
- 推荐系统实践 0x0d GBDT+LR
前一篇文章我们介绍了LR->FM->FFM的整个演化过程,我们也知道,效果最好的FFM,它的计算复杂度已经达到了令人发指的\(n^2k\).其实就是这样,希望提高特征交叉的维度来弥补稀疏特 ...
- Kubernetes Python Client 初体验之安装授权
最近想做一个基于flask的云平台管理服务器,利用python调用kubenetes提供的API来实现云平台的操作.笔者使用的是Windows,kubernetes集群安装在Ubuntu和Respbi ...
- MySQL(一):MySQL数据库事务与锁
基本概念 事务是指满足ACID特性的的一组操作,可以通过Commit提交事务,也可以也可以通过Rollback进行回滚.会存在中间态和一致性状态(也是真正在数据库表中存在的状态) ACID Atomi ...
- oracle 11.2.0.4下载
Oracle 11.2.0.4下载地址 Linux x86: https://updates.oracle.com/Orion/Services/download/p13390677_112040_L ...