二分查找数组中与目标数字(可以是浮点型)最近的数的位置

 0 ///欢迎批评指正 1 #include <stdio.h>
 2
 3 int a[100];
 4
 5 int search(int start,int end,double distinction){
 6     int mid;
 7     if(distinction > a[end - 1])
 8         return end - 1;
 9     if(distinction < a[start])
10         return start;
11     while(1){
12         mid = (start + end) / 2;
13         if(a[mid - 1] < distinction && a[mid] > distinction)
14             return ((a[mid] - distinction) >= (distinction - a[mid - 1])) ? mid - 1 : mid;
15         if(distinction > a[mid]){///(a[start] + a[end]) / 2.0 >
16             start = mid;
17         }else if(distinction < a[mid]){
18             end = mid;
19         }else{
20             return mid;
21         }
22     }
23 }
24 int main(void){
25     int n;
26     double m;
27     printf("输入数组元素个数:\n");
28     scanf("%d",&n);
29     for(int i = 0; i < n; i++)
30         scanf("%d",&a[i]);
31     while(scanf("%lf",&m)!=0){
32         printf("%d\n",search(0,n,m));
33     }
34
35     return 0;
36 }
时间: 2024-12-12 17:38:52

二分查找数组中与目标数字(可以是浮点型)最近的数的位置的相关文章

查找数组中重复的数字

题目来源于<剑指Offer>中的面试题3:找出数组中重复的数字. // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, // 也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3}, // 那么对应的输出是重复的数字2或者3. 解决方法有多种,包括数组排序,哈希表法,以及作者推荐的重排数组法.此处介绍自己的一个做法,以空间换时间,通过新建数组来实现快速查

【LeetCode-面试算法经典-Java实现】【155-Find Minimum in Rotated Sorted Array II(找旋转数组中的最小数字II)】

[154-Find Minimum in Rotated Sorted Array II(找旋转数组中的最小数字II)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? Would this affect the run-time complexity? How and why? Supp

剑指Offer面试题:6.旋转数组中的最小数字

一 题目:旋转数组中的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 这道题最直观的解法并不难,从头到尾遍历数组一次,我们就能找出最小的元素.这种思路的时间复杂度显然是O(n).但是这个思路没有利用输入的旋转数组的特性,肯定达不到面试官的要求. 我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组

旋转数组中的最小数字

题目描述:把一个数组最开始的若干个元素移动到数组的末尾,称之为一个数组的旋转.输入一个递增排序的数组的旋转,输出旋转数组的最小元素. 例如:数组 {3,4,5,1,2} 为{1,2,3,4,5} 的一个旋转,该数组的最小元素为 1. 分析: int Min(int* numbers, int length) {     if(numbers == NULL || length <= 0)         throw new std::exception("Invalid parameter

【LeetCode-面试算法经典-Java实现】【153-Find Minimum in Rotated Sorted Array(找旋转数组中的最小数字)】

[153-Find Minimum in Rotated Sorted Array(找旋转数组中的最小数字)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 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). Find the minimum element. You m

【LeetCode每天一题】Single Number(数组中单独的数字)

Given a non-empty array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? Example 1: Input: [2,2,1] Output:

【剑指offer】数组中重复的数字

题目链接:数组中重复的数字 题意:在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. 题解:丢进set,统计,查找,输出.STL大法好! 代码: 1 class Solution { 2 public: 3 // Parameters: 4 // numbers: an array

《数据结构、算法与应用》8.(顺序查找数组中第一个出现指定元素的位置)

最近在读<数据结构.算法与应用>这本书,把书上的习题总结一下,用自己的方法来实现了这些题,可能在效率,编码等方面存在着很多的问题,也可能是错误的实现,如果大家在看这本书的时候有更优更好的方法来实现,还请大家多多留言交流多多指正,谢谢 8. 从左至右检查数组a[0:n-1]中的元素,以查找雨x相等的那些元素.如果找到一个元素与x相等,则函数返回x第一次出现所在的位置.如果在数组中没有找到这样的元素,函数则返回-1. // // main.cpp // Test_08 // // Created

去掉数组中重复的数字

冒泡排序语法: for (int i = 0; i < 数组长度 - 1; i++) { for (int j = 0; j < 数组长度 - i - 1; j++) { if (数组名[j] < 数组名[j + 1]) { int empty = 数组名[j]; 数组名[j] = 数组名[j + 1]; 数组名[j + 1] = empty; } } } 上面这个语法是降序排序,如果想升序的话就把if(数组名[j]<数组名[j=1])里面的小于号“<”改成大于号“>”