yeshaoting 写道
算法描述:
一个栈stack,具有push和pop操作,其时间复杂度皆为O(1)。
设计算法max操作,求栈中的最大值,该操作的时间复杂度也要求为O(1)。
可以修改栈的存储方式,push,pop的操作,但是要保证O(1)的时间复杂度,空间时间复杂度无要求。
思路:
我借助一个变量count和一个数组空间(其实就是一个栈)完成该时间复杂度为O(1)的算法设计。
这里面不需要用到快排吧。。那样的话还能叫o(1)?
贴上我的code:用了个最大栈保存添加路径上的最大值,删除的时候如果相等撤销最大值栈中的顶部元素即可。
另鄙视下,共享东西的时候都鼓掌叫好,求助发问就隐藏哦鄙视哦扣分哦臭鸡蛋烂白菜都来了。。。不多说了 果断以后文章只丢博客里
package sunfa;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.Random;
public class LinkedListMaxVal<E> {
public static void main(String[] args) {
LinkedListMaxVal<Integer> stack = new LinkedListMaxVal<Integer>(
new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
Random ran = new Random();
for (int i = 1; i <= 20; i++) {
stack.push(ran.nextInt(100));
System.out.println(stack + "," + stack.max()+","+stack.maxStack);
if (i % 4 == 0) {
Integer ee = stack.peek();
System.out.println("=============>pop:"+ee+"," + stack + "," + stack.max()+","+stack.maxStack);
stack.pop();
}
}
System.out.println("pop all>>>>>>>>>>>>>------------------");
System.out.println("删除的元素 | 数据栈 | 最大值 | 最大值栈");
while(!stack.isEmpty()){
Integer ee = stack.peek();
System.out.println("pop:" +ee+","+ stack + "," + stack.max()+","+stack.maxStack);
stack.pop();
}
System.out.println("---end-----");
System.out.println(stack);
}
private Object[] item;
private int count;//栈内元素数目 ,栈顶元素索引为count-1
private LinkedList<E> maxStack = new LinkedList<E>();//最大值备用栈,为省事借用链表
private final String EMPTY_STACK_STR = "空栈";
private Comparator<E> comp;
public LinkedListMaxVal(Comparator<E> c) {
item = new Object[10];
comp = c;
}
public void push(E e) {
if (e == null)
throw new NullPointerException();
if (count + 1 == item.length)
item = Arrays.copyOf(item, item.length << 1);
item[count++] = e;
if (count == 1)
maxStack.push(e);
else {
if (compare(maxStack.peekFirst(), e) <= 0)//=号不要丢了,这很关键
maxStack.push(e);
}
}
public E pop() {
if (isEmpty())
throw new NullPointerException(EMPTY_STACK_STR);
E e = peek();
item[count - 1] = null;
if (count == 1)
maxStack.pop();
else {
if (compare(maxStack.peekFirst(), e) == 0)
maxStack.pop();
}
count--;
return e;
}
public E max() {
if (maxStack.isEmpty())
throw new NullPointerException(EMPTY_STACK_STR);
return maxStack.peekFirst();
}
public E peek() {
if (isEmpty())
throw new NullPointerException(EMPTY_STACK_STR);
return (E) item[count - 1];
}
private int compare(E e1, E e2) {
return comp != null ? (((comp).compare(e1, e2)))
: (((Comparable<E>) e1).compareTo(e2));
}
public boolean isEmpty() {
return count == 0;
}
public String toString() {
String s = "[";
for (int i = 0; i < item.length; i++) {
if (item[i] != null)
s += item[i] + ",";
}
if (s.length() == 1) {
s += "]";
} else {
s = s.substring(0, s.length() - 1) + "]";
}
return s;
}
}
分享到:
相关推荐
本资源“百度面试算法题汇总”旨在为面试者提供一系列的算法题目和解决方案,帮助他们提升在面试中的表现。下面将详细探讨这些算法题目涉及的知识点,并给出相应的解题思路。 首先,面试中常见的算法题型包括但不...
基于栈的算术表达式求值算法是一种常见的计算方法,主要应用于解决逆波兰表示法(Reverse Polish Notation,RPN)或中缀表达式的求值问题。本实验旨在让学生掌握栈这种数据结构的定义和实现,并能利用栈解决实际问题...
### 分治算法在求解最大值与最小值问题中的应用 #### 一、分治算法原理及背景 分治算法是一种高效的问题解决策略,它通过将一个复杂的问题分解成若干个相同或相似的小问题来逐步求解。这些小问题彼此独立且与原...
在本实例中,我们将探讨如何使用Matlab实现粒子群算法来求解函数的最大值。 首先,理解PSO的基本概念至关重要。每个粒子代表可能的解决方案,其位置和速度是算法中的两个关键变量。粒子在搜索空间中移动,速度决定...
3. **递归函数**:`getSecMax()`函数实现了分治算法的核心逻辑,用于求解指定区间内的最大值和第二大值。 - 如果区间的长度小于等于1,直接处理并返回结果。 - 否则,将数组分为两个部分,并递归地对每一部分调用`...
粒子群优化算法(Particle Swarm Optimization, PSO)是一种基于群体智能的优化算法,源自对自然界中鸟群或鱼群集体行为的研究。这种算法利用种群中的每个个体(粒子)通过迭代寻找全局最优解,每个粒子都有自己的...
《使用遗传算法求解函数最大值问题》 在信息技术领域,人工智能(AI)是一个不可或缺的分支,其中遗传算法(Genetic Algorithm, GA)作为一种优化工具,被广泛应用于解决各种复杂问题,包括寻找函数的最大值。遗传...
1.通过修改完善课件案例 3.3 的算法,利用栈来实现算术表达式求值的算法。对算法中调 用的几个函数要给出其实现过程: (1) 函数 In(c):判断 c 是否为运算符; (2) 函数 Precede(t1,t2):判断运算符 t1 和 t2 的...
本话题主要探讨了如何利用遗传算法来寻找Rosenbrock函数的最大值。Rosenbrock函数是一个常用的测试函数,它在多维空间中具有很多局部极小值,但只有一个全局最小值,因此对于优化算法来说具有很大的挑战性。 ...
在这个案例中,我们利用遗传算法来求解多元函数的最大值。下面将详细介绍遗传算法的基本原理及其在解决这类问题中的应用。 首先,遗传算法的核心思想来源于达尔文的“适者生存”原理,它通过模拟种群进化的过程来...
二、MATLAB实现遗传算法求函数最大值 MATLAB提供了内置的Global Optimization Toolbox,其中包括遗传算法工具箱,方便我们实现遗传算法。以下是一般步骤: 1. 定义目标函数:首先,需要编写一个函数来计算给定输入...
根据给定文件的信息,我们可以提炼出与ACM算法题及经典算法库相关的多个知识点。以下是对这些知识点的详细解析: ### ACM国际大学生软件大赛简介 ACM(Association for Computing Machinery)国际大学生软件大赛是...
《基于栈结构的中缀表达式求值》 在计算机科学中,中缀表达式是一种常见的数学表达方式,其中运算符位于其操作数之间。在处理这类表达式时,我们通常需要将其转换或直接解析为后缀表达式(也称为逆波兰表示法),...
在这道题中,我们需要计算一个数组中的所有子数组的和,并输出最大值。为了实现这一目标,我们需要对数组进行遍历,并使用合适的算法来计算子数组的和。 知识点四: 在二元树中找出和为某一值的所有路径 在这道题中...
根据时间复杂度的定义,时间复杂度为O(f(n))的算法意味着算法的执行时间最多不超过函数f(n)的常数倍。选项分析显示,T(n)=T(n/2)+1的时间复杂度最优,为O(log2n),因为对于每次迭代,问题规模减少为原来的一半,所以...
面试高频算法题总结-剑指Offer题解,主要包含: 数据结构 数组 字符串 链表 栈和队列 二叉树 图 堆 线段树 字典树 单调栈 算法 二分查找 排序 递归 动态规划 分治 记忆化搜索 贪心 回溯 位运算 数学 设计 其他 共66...
想买纸质书已经买不上了.pdf格式的, 有目录索引,阅读方便.
在C语言中,中缀表达式求值是一个常见的编程问题,它涉及到数据结构中的栈这一概念。本题目的目标是设计一个程序,能够接收一个中缀表达式(包含加、减、乘、除和括号),然后计算其结果。为了实现这个功能,我们...
面试中的算法题通常要求在有限的时间内编写出正确且高效的代码,因此熟练掌握这些基础算法和数据结构,并能灵活应用,对于提升面试表现和实际工作能力都非常有帮助。通过不断练习和深入理解,你可以逐步提升自己的...
2. 设计和实现算法:书中提供了许多经典的算法,如快速排序、归并排序、二分查找等,读者需要学会如何编写这些算法的代码。 3. 数学应用:部分习题涉及到概率、图论、组合数学等领域的知识,这些是理解和设计某些...