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)或中缀表达式的求值问题。本实验旨在让学生掌握栈这种数据结构的定义和实现,并能利用栈解决实际问题...
本实验“新实验五 人工智能之遗传算法求解函数最大值”着重于如何利用遗传算法寻找给定函数的最大值。下面将详细解释遗传算法的基本原理、C#实现细节以及在Visual Studio中的应用。 1. **遗传算法概述** - 基本...
### 分治算法在求解最大值与最小值问题中的应用 #### 一、分治算法原理及背景 分治算法是一种高效的问题解决策略,它通过将一个复杂的问题分解成若干个相同或相似的小问题来逐步求解。这些小问题彼此独立且与原...
用C++实现的遗传算法求函数的最大值,可运行
在本实例中,我们将探讨如何使用Matlab实现粒子群算法来求解函数的最大值。 首先,理解PSO的基本概念至关重要。每个粒子代表可能的解决方案,其位置和速度是算法中的两个关键变量。粒子在搜索空间中移动,速度决定...
3. **递归函数**:`getSecMax()`函数实现了分治算法的核心逻辑,用于求解指定区间内的最大值和第二大值。 - 如果区间的长度小于等于1,直接处理并返回结果。 - 否则,将数组分为两个部分,并递归地对每一部分调用`...
本书《算法面试题100道for阿里、百度、腾讯、京东、美团、今日头条.pdf》是一份面向希望进入中国顶尖互联网公司(如阿里、百度、腾讯、京东、美团、今日头条等)工作,尤其是软件开发岗位的求职者,所准备的面试材料...
粒子群优化算法(Particle Swarm Optimization, PSO)是一种基于群体智能的优化算法,源自对自然界中鸟群或鱼群集体行为的研究。这种算法利用种群中的每个个体(粒子)通过迭代寻找全局最优解,每个粒子都有自己的...
《使用遗传算法求解函数最大值问题》 在信息技术领域,人工智能(AI)是一个不可或缺的分支,其中遗传算法(Genetic Algorithm, GA)作为一种优化工具,被广泛应用于解决各种复杂问题,包括寻找函数的最大值。遗传...
1.通过修改完善课件案例 3.3 的算法,利用栈来实现算术表达式求值的算法。对算法中调 用的几个函数要给出其实现过程: (1) 函数 In(c):判断 c 是否为运算符; (2) 函数 Precede(t1,t2):判断运算符 t1 和 t2 的...
在这个案例中,我们利用遗传算法来求解多元函数的最大值。下面将详细介绍遗传算法的基本原理及其在解决这类问题中的应用。 首先,遗传算法的核心思想来源于达尔文的“适者生存”原理,它通过模拟种群进化的过程来...
《基于栈结构的中缀表达式求值》 在计算机科学中,中缀表达式是一种常见的数学表达方式,其中运算符位于其操作数之间。在处理这类表达式时,我们通常需要将其转换或直接解析为后缀表达式(也称为逆波兰表示法),...
栈的应用广泛,其中之一就是用于解决算术表达式的求值问题。本文将深入探讨如何利用栈来实现一个算术表达式求值的程序。 首先,我们要理解算术表达式的构成。一个基本的算术表达式可能包含数字、运算符(如加号"+...
在这道题中,我们需要计算一个数组中的所有子数组的和,并输出最大值。为了实现这一目标,我们需要对数组进行遍历,并使用合适的算法来计算子数组的和。 知识点四: 在二元树中找出和为某一值的所有路径 在这道题中...
根据时间复杂度的定义,时间复杂度为O(f(n))的算法意味着算法的执行时间最多不超过函数f(n)的常数倍。选项分析显示,T(n)=T(n/2)+1的时间复杂度最优,为O(log2n),因为对于每次迭代,问题规模减少为原来的一半,所以...
在C语言中,中缀表达式求值是一个常见的编程问题,它涉及到数据结构中的栈这一概念。本题目的目标是设计一个程序,能够接收一个中缀表达式(包含加、减、乘、除和括号),然后计算其结果。为了实现这个功能,我们...
2. 设计和实现算法:书中提供了许多经典的算法,如快速排序、归并排序、二分查找等,读者需要学会如何编写这些算法的代码。 3. 数学应用:部分习题涉及到概率、图论、组合数学等领域的知识,这些是理解和设计某些...
在本资源中,我们主要关注的是使用C语言实现算法的解答,这涵盖了算法的第1到第4个部分。C语言是一种广泛用于系统编程、应用编程、嵌入式系统以及编写算法实现的强大编程语言。其简洁性和高效性使得它成为学习和理解...
【Python遗传算法求一元函数最大值】 遗传算法是一种基于生物进化原理的全局优化方法,它模拟了自然选择、遗传和突变等生物进化过程来寻找问题的最优解。在这个案例中,我们将使用Python实现遗传算法来求解一元函数...