二分查找 变形


#include<stdio.h>

int solver(const int a[],const int n,const int t)
{
int total = 0;
if (NULL == a && 0 >= n)
return total;
int start = 0;
int end = n-1;
while(start <= end)
{
printf("%d %d\n",start,end);
int middle = (start + end)/2;
if(t == a[middle])
{
total = 1;
int cursor = 0;
while(++cursor && middle + cursor < n && t == a[middle + cursor])
total++;
cursor = 0;
while(--cursor && middle + cursor >= 0 && t == a[middle + cursor])
total++;
return total;
}
else if(t > a[middle])
end = middle - 1;
else
start = middle + 1;
}
return total;
}

int main()
{
int a[] = {1,1,1,1,1,1};
int b[] = {1,2,2,2,2,3};
int c[] = {1,2,3,5,6,7};
printf("%d",solver(b,6,4));
}

二分查找 变形

时间: 2024-10-17 19:33:34

二分查找 变形的相关文章

详解二分查找算法

我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky... 这句话可以这样理解:思路很简单,细节是魔鬼. 本文就来探究几个最常用的二分查找场景:寻找一个数.寻找左侧边界.寻找右侧

leetcode旋转数组查找 二分查找的变形

http://blog.csdn.net/pickless/article/details/9191075 Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return it

二分查找及变形

二分查找是在完全有序数组(或部分有序)中对某一元素进行快速查找的算法.时间复杂度为O(logn). 实现方式有递归和非递归. 非递归实现 public int binarySearch(int[] nums, int key) { if (nums == null || nums.length == 0) { return -1; } int low = 0, high = nums.length - 1; while (low <= high) { int mid = low + (high

二分查找各种变形

统计一个数字在排序数组中出现的次数. #include<iostream> #include<math.h> #include <vector> #include <string> #include <deque> #include <stack> #include <queue> #include <map> #include <unordered_map> #include <set>

算法题16 二分查找及相关题目

二分查找思想就是取中间的数缩小查找范围,对应不同的题目变形,在取到中间数mid确定下一个查找范围时也有不同,左边界有的low=mid+1,也可能low=mid,右边界有的high=mid-1,也有可能high=mid. 对于一个排序数组来说二分查找的时间复杂度是O(logn) 1. 二分查找法 1 int BinarySearch(int arr[],int len,int target) 2 { 3 if (arr==NULL||len<=0) 4 throw std::exception(&qu

二分查找及其落点问题

对于传统的二分查找,若能找到,则返回target的下标,若找不到则返回-1后,退出函数.齐代码比较简单,如下: int bSearch(vec<int> vec, int start,int end,int target) { int first = start,last = end,mid; while(first<=last) { mid = (first + last)>>1; if(vec[mid] == target) return mid; else if(vec

二分查找、二分查找大于等于key的第一个元素、二分查找小于等于key的最后一个元素

二分查找很简单,二分查找的变形需要注意一些细节. 1.当找大于等于key的第一个元素,或者查找小于等于key的最后一个元素时, 循环条件是 low < high,这和基本的二分查找不同, 但需要在循环退出的时候,判断是否满足条件: 2.如果是找最后一个满足条件的情况, 下限移动时不能用 low=mid+1:而应该用 low=mid: 此时,mid计算时应该用 mid=(low+high+1)/2, 保证 最后low.high相差1时不会陷入死循环, 循环退出后,下限可能是结果: 3.如果是找第一

二分查找:在有序数组中搜索大于等于x的数的最小下标

标准的二分查找,大家可能都已经能记在脑海里了,但是稍微变形一下,可能就会出问题. 本文写了一个二分查找算法,并且做了一个测试的脚手架,用二分查找和普通算法的结果进行比较来验证算法的正确性. 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int find(int a[],int n ,int x) 5 { 6 int i=0,j=n-1; 7 int ret=-1; 8 while(i<j) 9

二分查找小结

在弄dp时感觉一道题需非要弄清二分查找不可.以前学二分一直就很迷惑,网上资料也各种各样.的确二分是个很容易写错的算法,今天只好不算太耐心的再看一遍二分.总感觉时间不够用.. 二分查找有许多细节,这次先抓主要矛盾.关于什么(left+rigth)/2溢出的问题啊先不考虑了.对我来说二分迷惑的地方还是在1.while(left?right) ?处到底是<还是<= 2.判断后mid到底是加一还是减一还是不变? 3.返回left还是right? 这次大概明白了一些,因为二分查找是看区间开闭的,对于左闭