a.题目链接:
【深基13.例1】查找 - 洛谷https://www.luogu.com.cn/problem/P2249
b.我的解法:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int length;
int times;
scanf("%d %d", &length, ×);
int* array_value = (int*)malloc(sizeof(int) * length); //用一个数组来存储输入的数值
int* array_sequence = (int*)malloc(sizeof(int) * times); //(因为一次性要查找多个值) 用一个数组来保存要查找的值
for (int i = 0; i < length; i++) {
scanf("%d", &array_value[i]);
}
for (int i = 0; i < times; i++) {
scanf("%d", &array_sequence[i]);
}
int left = 0;
int right = length - 1;
for (int i = 0; i < times; i++) {
while (left <= right) {
int center = left + (right - left) / 2;
if (array_value[center] >= array_sequence[i]) {
right = center - 1;
}
else {
left = center + 1;
}
} //二分查找法中找第一个与value相同的值的经典写法。
if(left < length && array_value[left] == array_sequence[i]) {
printf("%d ", left + 1);
}
else {
printf("-1 ");
}
left = 0;
right = length - 1; //这里要记得给left和right再次赋值,经验告诉我,循环里面套循环,总有一些变量得在两个循环之重新赋值。
}
free(array_value);
free(array_sequence);//记得养成free的习惯。
return 0;
}
c.我的看法:
//要养成计算时间复杂度的习惯。
//尽量开始用c++做题
//顺便一提二分法及其相关变形使用条件应该是:顺序存储结构 , 且以一定顺序存储(排序方式不唯一)。 ------(如有不对, 欢迎斧正);
//学会耐心地看题解 , 做完一个看一个, 不要等做完一个系列再看。