首页 > 试题广场 >

下一个更大的数(二)

[编程题]下一个更大的数(二)
  • 热度指数:850 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个循环的数组 nums ,即 nums 的第一个元素可以视为是最后一个元素的下一个元素。返回 nums 中每个元素的后面第一个比他大的元素,如果不存在比他大的元素,则返回 -1。

例如,有数组 [2,3,4,1] 则返回 [3,4,-1,2] ,其中第一二个元素后面第一个比他们大的元素均是下一个元素,第三个元素是最大的,所以输出 -1,而最后一个元素的下一个元素认为是数组的第一个元素,因此是 2

数据范围:数组长度满足 ,数组中的元素满足
示例1

输入

[2,3,4,1]

输出

[3,4,-1,2]

说明

其中第一二个元素后面第一个比他们大的元素均是下一个元素,第三个元素是最大的,所以输出 -1,而最后一个元素的下一个元素认为是数组的第一个元素,因此是 2 
示例2

输入

[4,3,2,1]

输出

[-1,4,4,4]
# -*- coding: utf-8 -*-


#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param nums int整型一维数组
# @return int整型一维数组
#
class Solution:
    """
    题目:
        https://www.nowcoder.com/practice/3923970e95b140fdb65e6c00bcda403d?tpId=196&tqId=40444&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3Fpage%3D8%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=undefined&tags=&title=
    算法:
        环形数组问题:
            先将数组展开,新数组看作是nums + nums[:-1],新数组的长度变为0 ~ 2*n-2;当然我们也可以对n取模,这样就不需要分配空间了
        建立单调递减栈,栈中存储元素下标
        遍历新数组0 ~ 2n-2:
            若stack为空 或者 nums[i] < stack[-1]:
                下标i%n入栈
            否则:
                栈顶元素出栈
                res[stack[-1]] = nums[i]
    复杂度:
        时间复杂度:O(n)
        空间复杂度:O(n), 单调栈的长度
    """

    def nextBigger(self, nums):
        # write code here
        n = len(nums)

        res, stack = [-1] * n, []
        for i in range(2 * n - 1):
            while stack and nums[stack[-1]] < nums[i % n]:
                idx = stack.pop()
                if res[idx] == -1:
                    res[idx] = nums[i % n]
            stack.append(i % n)
        return res


if __name__ == "__main__":
    sol = Solution()

    # nums = [2, 3, 4, 1]

    nums = [4, 3, 2, 1]

    res = sol.nextBigger(nums)

    print res

发表于 2022-06-23 14:32:31 回复(0)