首先,这个问题的最容易想到的就是冒泡排序。先把N个数存入数组中,之后 用冒泡算法从大到小排序,在取k位置的值。
具体求解过程如下:
import java.util.Random; public class MaxK{ static int[] nums = new int[20]; static Random rand = new Random(4); public static void main(String[] args){ int k = Integer.parseInt(args[0]); init(); printNums(nums); int[] sortBubble = bubbleSort(nums); printNums(sortBubble); System.out.println(sortBubble[k - 1]); } static void printNums(int[] nums){ for(int i = 0, len = nums.length; i < len; i++) System.out.print(nums[i] + " "); System.out.println(); } static void init(){ for(int i = 0; i < 20; i++) nums[i] = rand.nextInt(100); } static int[] bubbleSort(int[] nums){ int arrLen = nums.length; int[] bubble = new int[arrLen]; System.arraycopy(nums, 0, bubble, 0, arrLen); for(int i = 0; i < arrLen; i++){ int tk = bubble[i]; int tkj = i + 1; for(int j = i + 1; j < arrLen; j++){ if(bubble[j] > tk){ tk = bubble[j]; tkj = j; } } if(tk > bubble[i]){ int temp = bubble[i]; bubble[i] = bubble[tkj]; bubble[tkj] = temp; } } return bubble; } }
还有稍微好一些的算法,就是先把前k个元素读入数组,再对其排序(递减)。接着逐个对比剩下的元素,将符合的元素插入k数组,调整k数组。
static int maxK(int lk){// 求第lk大的数值 int[] karr = new int[lk]; System.arraycopy(nums, 0, karr, 0, lk); int[] bubbledKarr = bubbleSort(karr); int rek = bubbledKarr[lk - 1]; for(int i = lk; i < 20; i++){ //20是nums长度,判断剩下的元素 if(nums[i] > bubbledKarr[lk -1]){ int loc = lk -2; for(; loc >=0 ; loc--) if(nums[i] < bubbledKarr[loc]) break; loc++; //定位插入元素位置 int[] temp = new int[lk - loc];//需要调整的k数组的值 System.arraycopy(bubbledKarr, loc, temp, 0, lk - loc); bubbledKarr[loc] = nums[i]; System.arraycopy(temp, 0, bubbledKarr, loc + 1, lk - loc -1);//调整替换元素之后的k数组 } } return bubbledKarr[lk - 1]; }
相关推荐
- 给定一个长度为 \( n \)(\( 1 \leq n \leq 200 \))的正整数 \( a \) 和一个正整数 \( k \)(\( k < n \)),其中 \( k \) 表示需要删除的数字的数量。 - 目标是设计一个算法来找到一种方式,使得删除 \( k \) 个...
在计算机科学领域,特别是数据处理和分析方面,“找到一组数中的前K个最大或最小的数”是一个常见而又重要的问题。这类问题不仅在日常开发工作中频繁出现,也是IT类考试的重点考察内容之一。本文旨在介绍几种解决这...
- 如果`low`与`high`相邻,即数组有且仅有两个元素,通过比较这两个元素的值来确定并返回最大值。 - 对于包含多个元素的数组,函数计算中间索引`mid`,将数组分成两半,并递归地调用自身来找出两半的最大值,最后...
假设我们有一个整数数组`arr`,我们需要找到其中的两个最大值`max1`和`max2`以及两个最小值`min1`和`min2`,并将它们从数组中移除。注意,这里我们假设数组长度至少为4,以确保有四个元素可供删除。 分治法的基本...
在本实验中,我们将使用分治算法来解决两个问题:一是查找n个数的最大值和最小值,二是找到第k个最小元素。 查找最大最小值 在这个问题中,我们将使用分治策略来解决问题。首先,我们将n个元素分成两组:A1={A[1],...
- **时间复杂度**:每次分割将搜索范围减半,因此平均时间复杂度为O(N*log(Vmax-Vmin)),其中Vmax和Vmin分别为数组的最大值和最小值。 - **核心算法**: - 定义一个初始范围[Vmin, Vmax]。 - 在范围内进行二分查找...
有时会增加限制条件,如找出第k大的数,或者在常数时间内求解最大值。 综上所述,"求最大数"是一个简单但实用的编程任务,其解决方案涵盖了多种编程语言、数据结构和算法,以及在实际应用中的各种场景。理解和掌握...
- **第一步**:从数据集中随机选择一个样本点作为第一个聚类中心。 - **第二步**:对于数据集中每个样本点\(x\),计算其与已选择的聚类中心之间的距离\(D(x)\)。 - **第三步**:选择下一个聚类中心的概率与\(D(x)...
首先,实验的第一个问题是删数问题。这个问题要求在给定的n位正整数a中去掉k个数字,使得剩下的数字排列成的新正整数尽可能大。为了解决这个问题,我们并不需要一次性找出所有可能的组合,而是采取贪心策略,依次...
35、 编写计算二叉树最大宽度的算法(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。 回溯法 36、 (组合问题)求出从自然数1,2,…,n中任取r个数的所有组合。 37、 传教士与野人渡河问题。有M个传教士...
- 当首项`a1`大于零,公差`d`小于零时,`Sn`有**最大**值,这个最大值发生在`an`等于0的项数`n`上,可以通过不等式组`an >= 0`和`an+1 来确定。 - 当首项`a1`小于零,公差`d`大于零时,`Sn`有**最小**值,这个...
时间复杂度为O(n+k),其中k是元素的范围。 这些排序算法各有优缺点,适用场景不同。例如,快速排序通常在实际应用中表现优秀,而归并排序则在稳定性上有优势。通过这个压缩包中的源代码,学习者可以对比不同算法的...
例如,从n个不同元素中选择k个元素的组合数记为C(n,k),排列数记为P(n,k)。组合数的计算公式为C(n,k) = n! / [k!(n-k)!],其中!表示阶乘。 2. **二项式定理**:这是组合数学中的一个重要定理,表示(a + b)^n可以...
- 如果k能够整除n,则k是n的一个质因数。 - 更新n为n/k,继续分解。 - 重复以上步骤直到n等于1。 #### 知识点6:成绩等级划分 - **定义**:根据分数划分等级。 - **实现思路**: - 使用条件运算符判断学生成绩...
公式为(α+β)^n=∑_{k=0}^{n}C(n,k)α^(n-k)β^k,其中C(n,k)是组合数,表示从n个不同元素中取k个元素的组合数。第三题和第四题考察的就是二项式定理中特定项的系数,这通常涉及到组合数的计算。 对于二项式定理中...
题目要求从一个N*M(N≤M)的矩阵中选出N个数,其中任意两个数字不能在同一行或同一列,并要求求出这N个数中第K大的数字的最小值。 #### 输入输出描述 - **输入描述**: 给定三个整数N, M, K (1≤K≤N≤M≤150),...
- **解析**:对于一个完全二叉树,第 n 层最多有 \(2^{n-1}\) 个结点,从第 1 层到第 n 层总共最多有 \(\sum_{i=0}^{n-1}2^i = 2^n - 1\) 个结点。正确答案是 A.2^n-1。 **6. 存储程序原理** - **题目内容**:提出...
该程序结合了两种基本的算法——冒泡排序和二分查找,实现了从键盘输入一组整数,排序后查找特定整数的功能。通过这种方式,不仅展示了这两种算法的基本实现方式,还演示了如何将它们结合起来解决实际问题。这对于...
- **计算复杂度**:K均值的时间复杂度为O(n * k * i),其中n是数据点数量,k是类别数,i是迭代次数,对于大数据集可能会较慢。 5. **改进与变种**: - **DBSCAN**:基于密度的聚类算法,能处理不规则形状的簇和...