要求使用时间复杂度为O(n)的算法,寻找数组中最小和次小元素的下标
思路:使用一个for循环
- 假设最小min1和次小min2就是数组中前两个数的下标
- 当循环到数组中的新元素时
- 新元素比最小的元素小,那么将min1的值更换成新元素的下标,min2的值更换成min1的值
- 新元素比最小的元素大,但比次小的元素小,那么min1的值不变,min2的值更换成新元素的下标
- 新元素比次小的元素大,则结束此次循环,以此类推判断下一个元素
- 为了简便,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)
运行结果如下: