代码随想录算法训练营第五十八天| LeetCode739. 每日温度、LeetCode496. 下一个更大元素 I

一、LeetCode739. 每日温度

        1:题目描述(739. 每日温度)

        给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

代码随想录算法训练营第五十八天| LeetCode739. 每日温度、LeetCode496. 下一个更大元素 I_第1张图片

        2:解题思路

class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        # 暴力解法,超时
        # answer = [0]*len(temperatures)
        # for i in range(len(temperatures)):
        #     for j in range(i+1, len(temperatures)):
        #         if temperatures[i] < temperatures[j]:
        #             answer[i] = j-i
        #             break
        # return answer

        # 使用单调栈
        # 使用栈来存储元素的下标,从栈头到栈尾,下标对应的元素依次递增(栈尾对应的元素最大,栈头对应的元素最小)
        # 判断要入栈下标对应的元素与栈内下标对应的元素的大小,有三种情况
        # 1:要入栈的下标对应的元素小于栈顶下标对应的元素
        # 将要入栈的下标,入栈
        # 2:要入栈的下标对应的元素等于栈顶下标对应的元素
        # 将要入栈的下标,入栈
        # 3:要入栈的下标对应的元素大于栈顶下标对应的元素
        # 将所有小于要入栈下标对应的元素的下标弹出,最后再将要入栈的下标入栈
        answer = [0]*len(temperatures)
        answer_stack = [0]
        for i in range(1, len(temperatures)):
            if temperatures[i] < temperatures[answer_stack[-1]]:
                answer_stack.append(i)
            elif temperatures[i] == temperatures[answer_stack[-1]]:
                answer_stack.append(i)
            else:
                # 要入栈的下标对应的元素大于栈顶下标对应的元素
                # 需要判断每个栈顶下标对应的元素
                while len(answer_stack) != 0 and temperatures[i] > temperatures[answer_stack[-1]]:
                    index = answer_stack.pop()
                    answer[index] = i - index
                # 遇到不大于栈顶下标对应的元素,或栈为空了,将遍历的当前元素下标入栈
                answer_stack.append(i)
        return answer

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

        1:题目描述(496. 下一个更大元素 I)

  nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。

        给你两个没有重复元素的数组 nums1nums2,下标从0开始计数,其中nums1nums2的子集。

        对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

        返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。

代码随想录算法训练营第五十八天| LeetCode739. 每日温度、LeetCode496. 下一个更大元素 I_第2张图片

        2:解题思路

        解法一:找到nums1在nums2中对应的元素,直接进行查找

class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
        ans = [-1] * len(nums1)
        for i in range(len(nums1)):
            index = nums2.index(nums1[i])       # 查找nums1中元素所在的nums2中的下标
            for j in range(index+1, len(nums2)):
                # 从下标的下一个位置,开始遍历,遇到大于所查找的元素时,将值赋值给ans
                if nums2[j] > nums2[index]:
                    ans[i] = nums2[j]
                    break
        return ans

        解法二:使用单调栈

class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
        # 使用单调栈
        # 使用栈来存储元素的下标,从栈头到栈尾,下标对应的元素依次递增(栈尾对应的元素最大,栈头对应的元素最小)
        # 判断要入栈下标对应的元素与栈内下标对应的元素的大小,有三种情况
        # 1:要入栈的下标对应的元素小于栈顶下标对应的元素
        # 将要入栈的下标,入栈
        # 2:要入栈的下标对应的元素等于栈顶下标对应的元素
        # 将要入栈的下标,入栈
        # 3:要入栈的下标对应的元素大于栈顶下标对应的元素
        # 将所有小于要入栈下标对应的元素的下标弹出,最后再将要入栈的下标入栈
        # 遍历nums2,查找每个元素的下一个更大的元素,找到之后,判断当前遍历的元素是否在nums1中出现过
        # 若出现过,找到该元素在nums1中的下标,将找到的下一个更大元素赋值给ans
        ans = [-1] * len(nums1)
        ans_stack = [0]    
        for i in range(1, len(nums2)):
            if nums2[i] <= nums2[ans_stack[-1]]:
                # 遍历的元素,小于等于栈顶的元素,将元素入栈
                ans_stack.append(i)
            else:
                while len(ans_stack)!=0 and nums2[i]>nums2[ans_stack[-1]]:
                    # 遍历的元素,大于栈顶的元素,并且栈不为空
                    index1 = ans_stack.pop()
                    # 将栈顶元素弹出
                    if nums2[index1] in nums1:
                        # 判断当前遍历的元素是否在nums1中,在nums1中
                        # 找到nums1中对应的下标,再给ans对应下标进行赋值
                        ans[nums1.index(nums2[index1])] = nums2[i] 
                ans_stack.append(i)
        return ans

你可能感兴趣的:(算法训练营(LeetCode),算法,leetcode,python,动态规划)