要求使用时间复杂度为O(n)的算法,寻找数组中最小和次小元素的下标

要求使用时间复杂度为O(n)的算法,寻找数组中最小和次小元素的下标

思路:使用一个for循环

  1. 假设最小min1和次小min2就是数组中前两个数的下标
  2. 当循环到数组中的新元素时
    • 新元素比最小的元素小,那么将min1的值更换成新元素的下标,min2的值更换成min1的值
    • 新元素比最小的元素大,但比次小的元素小,那么min1的值不变,min2的值更换成新元素的下标
    • 新元素比次小的元素大,则结束此次循环,以此类推判断下一个元素
  3. 为了简便,min1,min2的初始值都赋为-1,由于根本上是数组元素之间的比较,因此当min1和min2为-1时,令q[min1], q[min2]都为一个很大的数。

C语言实现如下:

#include<stdio.h>
const int MAX = 100010;
int N = 100000; //数组的最大长度
int q[N]; // 数组
int main(){
    
    
	int n = 0;
	scanf("%d",&n);
	for(int i = 0; i < n; i++) scanf("%d",&q[i]);
	int min1 = -1, min2 = -1; //初始化最小和次小元素的下标
	for(int i = 0; i < n; i++){
    
    
		// 如果min1==-1,处于未赋值的状态,此时i=0,那么min1=0
		//如果min1 != -1,则将当前遍历到的元素与目前的最小值比较
		if(q[i] < min1 == -1 ? MAX : num[min1]){
    
    
			// 如果新元素比最小的元素小,那么将min1的值更换成新元素的下标,min2的值更换成min1的值
			min2 = min1;
			min1 = i;
		}
		else if(q[i] < min2 == -1 ? MAX : num[min2]){
    
    
			// 新元素比最小的元素大,但比次小的元素小,那么min1的值不变,min2的值更换成新元素的下标
			min2 = i;
		}
	}
	printf("min1 = %d, min2 = %d",min1, min2);
	return 0;
}

python实现代码如下:

q  = [22,8,1,9,8,7]
min1 = -1
min2 = -1
MAXval = 100010

def getVal(min):
    if min == -1:
        return MAXval
    else :
        return q[min]
for i in range(len(q)):
    if q[i] < getVal(min1):
        min2 = min1
        min1 = i
    elif q[i] < getVal(min2):
        min2 = i
print("min1,min2",min1,min2)

运行结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43943476/article/details/125695792