算法之定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))

var stack = [];
function push(node)
{
    // write code here
    stack.push(node);
}
function pop()
{
    // write code here
    return stack.pop();
}
function top()
{
    // write code here
    return stack[stack.length - 1];
}
function min()
{
    // write code here
    // 或者使用 ES6 语法 Math.min(...stack)
    return Math.min.apply(null, stack);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法思路: 分治法的思想是将问题分成更小的子问题,分别解决子问题,最后将子问题的解合并起来得到原问题的解。对于求最大元素和次大元素,我们可以将序列分成两个子序列,分别求出左右子序列的最大元素和次大元素,然后比较两个子序列的最大元素和次大元素得到整个序列的最大元素和次大元素算法实现定义一个函数 maxSecondMax(nums, left, right),其 nums 为n个实数的序列,left 为序列的左端点,right 为序列的右端点。如果 left = right,则返回(nums[left], None),即只有一个元素,最大元素为该元素,次大元素为None。如果 left+1 = right,则返回(nums[left], nums[right]),即只有两个元素,最大元素为较大的那个,次大元素为较小的那个。否则,将序列分成左右两个子序列,分别求出左右子序列的最大元素和次大元素,然后比较两个子序列的最大元素和次大元素得到整个序列的最大元素和次大元素。 具体实现代码如下: ```python def maxSecondMax(nums, left, right): if left == right: return (nums[left], None) if left+1 == right: return (max(nums[left], nums[right]), min(nums[left], nums[right])) mid = (left+right)//2 left_max, left_second_max = maxSecondMax(nums, left, mid) right_max, right_second_max = maxSecondMax(nums, mid+1, right) if left_max >= right_max: if left_second_max is None or left_second_max < right_max: return (left_max, right_max) else: return (left_max, left_second_max) else: if right_second_max is None or right_second_max < left_max: return (right_max, left_max) else: return (right_max, right_second_max) ``` 算法分析: 对于一个长度为n的序列,每次都将序列分成两个子序列,因此算法时间复杂度为O(nlogn)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值