蓝桥杯知识点(杂)
一、二分查找
1、普通的二分查找
使用二分查找的前提就是必须是有序的数组
关于二分查找,首先需要注意的是,所给的区间,一般情况下有两种,第一种就是两头都是闭区间,第二种就是左闭右开的区间
第一种
/*
[1,mid],[mid+1,size]
*/
int BinarySelect(int* arr, int n, int target) {
int left = 0;
int right = n - 1;
while (left <= right) {
int mid = (left + right) >> 1;
if (arr[mid] > target) {
right = mid - 1;
}
else if (arr[mid] < target) {
left = mid + 1;
}
else {
return mid;
}
}
return -1;
}
int main() {
int arr[] = {
1,2,3,4,5,6,7,8,9,10 };
int n = sizeof(arr) / sizeof(int);
//所找的元素,则我们返回的就是他的下标
int target = 8;
int index = BinarySelect(arr, n, target);
printf("index = %d\n", index);
return 0;
}
第二种
/*
[1,mid-1],[mid,size]
*/
int BinarySelect(int* arr, int n, int target) {
int left = 0;
int right = n - 1;
while (left < right) {
int mid = (left + right) >> 1;
if (arr[mid] > target) {
right = mid;
}
else if (arr[mid] < target) {
left = mid + 1;
}
else {
return mid;
}
}
return -1;
}
int main() {
int arr[] = {
1,2,3,4,5,6,7,8,9,10 };
int n = sizeof(arr) / sizeof(int);
//所找的元素,则我们返回的就是他的下标
int target = 10;
int index = BinarySelect(arr, n, target);
printf("index = %d\n", index);
return 0;
}
2、二分查找的列题
Demo:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>
//数组中的数为num,要查找的数是x
bool isBlue1(int num, int x) {
if (num < x) {
return true;
}
else {
return false;
}
}
//数组中的数为num,要查找的数是x
bool isBlue2(int num, int x) {
if (num <= x) {
return true;
}
else {
return false;
}
}
int binary_select1(int* arr,int n,int x) {
int left = -1, right = n;
while (left + 1 != right) {
int mid = (left + right) >> 1;
if (isBlue1(arr[mid], x)) {
left = mid;
}
else {
right = mid;
}
}
if (arr[right] == x) {
return right;
}
else {
return -1;//找不到返回-1
}
}
int binary_select2(int* arr,int n,int x) {
int left = -1;
int right = n;
while (left + 1 != right) {
int mid = (left + right) >> 1;
if <