计算一组数字中最小的若干个数字(Java数组和栈实现)

简介: 本文目录1. 问题2. 思路2.1 思路12.2 思路22.3 思路33. 实现

1. 问题

如果有若干个数字,输入其中所有最小的数字。


例如,输入1 2 3 1 2 1 4 5,则输出1 1 1


2. 思路

2.1 思路1

最简单的思路是排序,按从小到大排序后,第一个就是最小的数字,然后从第一个往后遍历,等于最小数字的输出即可。但是这种方案需要两层循环,时间复杂度是O(n^2),应该寻求更快的方案。


2.2 思路2

想一下人如果去干这件事怎么实现,首先是找到最小的值,然后找与最小值相同的数字即可,这种需要从头到尾扫描数字两遍。


2.3 思路3

还有更快的方案,我只扫描所有数字一遍,把第一个数字当做最小,后面只把小于等于当前数字的记下来。这样我记下来的最后一个数字必然是最小的,然后从后往前看跟最小的数字相同的输出即可。


3. 实现

可以用数组实现,也可以用栈实现。因为输出是从后往前输出,正好符合栈后进先出的特点。代码如下:

/**
 * 获取最小的若干数字
 * @author maoge
 * @date 2019-02-27
 */
public class GetMinNum {
  /**
   * 入口
   */
  public static void main(String[] args) {
    int[] input = { 1, 2, 3, 1, 2, 1, 4, 5 };
    System.out.println("====数组计算结果====");
    getMinNumByArray(input);
    System.out.println("");
    System.out.println("====栈计算结果====");
    getMinNumByStack(input);
    System.out.println("");
  }
  /**
   * 通过数组计算最小的几个数字
   */
  public static void getMinNumByArray(int[] input) {
    //定义用来输出的数组
    int[] output = new int[input.length];
    //输出数组当前操作位置
    int location=0;
    output[location]=input[0];
    for (int i = 1; i < input.length; i++) {
      if (input[i] <= output[location]) {
        location++;
        output[location]=input[i];
      }
      i++;
    }
    //打印结果
    for(int j=location;j>=0;j--) {
      //output[location]是最小值
      if(output[location]==output[j]) {
        System.out.print(output[j]);
      }
    }
  }
  /**
   * 通过栈计算最小的几个数字
   */
  public static void getMinNumByStack(int[] input) {
    Stack<Integer> stack=new Stack<Integer>();
    int min=input[0];
    stack.push(min);
    //不大于最小的入栈
    for (int i = 1; i < input.length; i++) {
      if(input[i]<=min) {
        stack.push(input[i]);
      }
    }
    //栈顶元素就是最小的元素
    int peek=stack.peek();
    while(stack.isEmpty()==false) {
      int num=stack.pop();
      if(num==peek) {
        System.out.print(num);
      }
    }
  }
}


//

相关文章
|
11天前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
32 2
|
15天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
20天前
|
存储 算法 Java
🧠Java零基础 - Java栈(Stack)详解
【10月更文挑战第17天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
15 2
|
23天前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
31 4
|
23天前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
19 2
|
1月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
|
1月前
|
机器学习/深度学习 算法 搜索推荐
让星星⭐月亮告诉你,Java冒泡排序及其时间复杂度计算
冒泡排序是一种简单的排序算法,通过多次遍历数组,每次比较相邻元素并交换位置,将较小的元素逐步移至数组前端。第一轮结束后,最小值会位于首位;第二轮则将次小值置于第二位,依此类推。经过 (n-1) 轮遍历后,数组完成排序。冒泡排序的时间复杂度为 O(n²),在最优情况下(已排序数组)时间复杂度为 O(n)。示例代码展示了如何实现冒泡排序。
49 1
|
15天前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
23 0
|
1月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
34 0
|
算法 Java
栈和队列【数据结构与算法Java】
栈和队列【数据结构与算法Java】
46 0