📌 博客主页 爆打维c
目录
一、二分查找的原理
1.优点
2.缺陷
3.原理(核心思想)
4.例题
描述
思路:
一、二分查找的原理
在讲原理之前,先为大家分析一下二分查找的优缺点。
1.优点
如果我们要在数组里面找一个元素的位置,虽然遍历可以暴力解决,但是二分查找的效率更高
遍历的时间复杂度O(n)
二分查找的时间复杂度O(logn)
2.缺陷
通常情况下,二分查找只适用于有序的数组(升序或降序),如果一个数组是无序的,那么就不能使用二分查找的办法找到一个元素的位置。且查找的数量只能是一个。
3.原理(核心思想)
分治:分治即“分而治之”,“分”指的是将一个大而复杂的问题划分成多个性质相同但是规模更小的子问题,子问题继续按照这样划分,直到问题可以被轻易解决;“治”指的是将子问题单独进行处理。经过分治后的子问题,需要将解进行合并才能得到原问题的解,因此整个分治过程经常用递归来实现。
二分查找二分左右界从而找到元素的位置,
4.例题
描述
给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数
要求:空间复杂度 O(1),时间复杂度O(logn)
数据范围:0 ≤ n ≤ 1000,0 ≤ k ≤ 100,数组中每个元素的值满足 0 ≤ val ≤ 100
知识点:数组,二分查找
示例1
输入:
[1,2,3,3,3,3,4,5],3
返回值:
4
思路:
因为该数组是非降序数组(即升序数组),这时候我们很容易就想到用二分查找的方法,但是一个数组可能有多个k,而且我们要查找的并非常规二分法中k出现的位置,而是k出现的左界和k出现的右界。要是能刚好找到恰好小于k的数字位置和恰好大于k的数字的位置就好了。
因为数组中全是整数,因此我们可以考虑,用二分查找找到k+0.5应该出现的位置和k−0.5应该出现的位置,二者相减就是k出现的次数。
🎃步骤1:写一个二分查找的函数找到元素在数组中出现的位置,每次检查区间中点值,根据与中点的大小比较,确定下一次的区间。
🎃步骤2:找出 k+0.5出现的位置 和 k−0.5出现的位置 然后二者相减。
#include<stdio.h>
int SearchPos(int* nums, int numsLen,float n) {
int left = 0, right = numsLen - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] > n) {
right = mid - 1;
}
if (nums[mid] < n) {
left = mid + 1;
}
return left;
}
}
int GetNumberOfK(int* nums, int numsLen, int k) {
// write code here
return SearchPos(nums, numsLen, k +0.5) - SearchPos(nums, numsLen, k - 0.5);
}
int main(){
int arr[5] = { 1,2,2,2,3 };
int k=GetNumberOfK(arr, 5, 2);
printf("%d", k);
return 0;
}
今天的内容到这里就结束了,喜欢的话给博主一个赞鼓励一下吧🥳