day58| 739. 每日温度、496.下一个更大元素 I
创始人
2024-01-30 09:21:36
0

文章目录

  • 一、739. 每日温度
  • 二、496.下一个更大元素 I

一、739. 每日温度

注意的点:

  1. 栈中存放的下标,而不是原数组的元素值。
  2. 栈维持的一个递减的序列(从栈底到栈顶),目的是当发现一个比较大的值出现时,可以找出原数组的相对位置,而不会丢失位置信息。
  3. 要一直看栈顶元素的对应值是否小于当前入栈元素的对应值,所以使用 while 而不是 if
  4. 要注意,比较的是以栈顶元素为下标的原数组元素值,而并非栈顶元素。
  5. 注意,每个位置的元素都会有一个入栈的操作。

以下是代码部分:

	//单调栈public int[] dailyTemperatures(int[] temperatures) {Stack s = new Stack<>();int[] result = new int[temperatures.length];//思路:在栈中维持一个递减的序列(从栈底到栈顶)for (int i = 0; i < temperatures.length; i++) {//要一直看栈顶元素是否小于当前入栈元素,所以使用 while 而不是 if//踩坑:temperatures[i] > s.peek()  ——>    这里不是>s.peek(),而是>temp[s.peek()]while (!s.isEmpty() && temperatures[i] > temperatures[s.peek()]){//这里要减s.peek,因为是求之间的距离result[s.peek()] = i - s.peek();s.pop();}//同时,还要进行一个入栈操作s.push(i);}return result;}

二、496.下一个更大元素 I

注意的点:

  1. 由于看到标记的是“简单”题,所以尝试使用了暴力破解法,结果真的可以通过。就是中间踩了一些坑。
  2. 使用单调栈的方式的话,相较于前一题,多了一个匹配的工序——计算出nums2数组的每个位置的值后,还要看该位置的元素是否也属于nums1,若是,则依据map哈希表给对应的result下标赋值,否则,不做处理。

以下是代码部分:

public class 下一个更大元素I496 {//暴力循环破解public int[] nextGreaterElement(int[] nums1, int[] nums2) {int[] result = new int[nums1.length];for (int i = 0; i < nums1.length; i++) {for (int j = 0; j < nums2.length; j++) {while (j < nums2.length && nums1[i] != nums2[j])j++;if(j == nums2.length)break;//这里迭代寻找第一个大于该值的数while (j < nums2.length && nums1[i] >= nums2[j]){j++;}if(j == nums2.length)break;//如果符合条件,即找到一个大的值,则返回该值if(nums1[i] < nums2[j]) {result[i] = nums2[j];break;}}//判断如果result为0,即没有被赋值,则置为-1if(result[i] == 0)result[i] = -1;}return result;}//单调栈方式//思路:其实就是在nums2中找右边第一个最大值,然后再看nums2中的元素是否在nums1中也存在public int[] nextGreaterElement2(int[] nums1, int[] nums2) {int[] result = new int[nums1.length];//要先全部初始化为-1for (int i = 0; i < result.length; i++) {result[i] = -1;}Map map = new HashMap<>();//这里map的value对应的是下标,这样好在result中进行对应的赋值for (int i = 0; i < result.length; i++) {map.put(nums1[i], i);}Stack s = new Stack<>();//对nums2进行右边最大值的查找for (int i = 0; i < nums2.length; i++) {while (!s.isEmpty() && nums2[s.peek()] < nums2[i]){//这里要进行查找、并赋值if(map.containsKey(nums2[s.peek()]))result[map.get(nums2[s.peek()])] = nums2[i];//弹出栈顶元素s.pop();}//入栈s.push(i);}return result;}
}  

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...