1、 由于是有序数组,log(n)的时间查找最小值的index

1.1 一定要注意当m、r、l三个位置相同值时,无法区分左右了,所以需要在l到r区间遍历找到最小元素。

2、 看最小值index的左右两侧,是否查找值落在 [l,i] 与 [i,r] 上,在对应区间上进行二分查找


 1 #include<iostream>
 2 using namespace std;
 3 int findminpos(int* a, int l, int r){
 4     int pos = l;
 5     int min = a[l];
 6     for(int i=l+1; i<=r; i++){
 7         if( min>a[i] ){
 8             min=a[i];
 9             pos=i;
10         }
11     }
12     return pos;
13 }
14 int findBound(int *a, int r){
15     if ( r==0 ) return 0;
16     int l = 0;
17     while(l<r){
18         if( r-l == 1 )break;
19         int m = (l+r)>>1;
20         cout << "search at: " << m << endl;
21         if( a[m] == a[r] && a[l] == a[m] ) return findminpos(a,l,r);
22         if( a[m] > a[r] ) l = m;
23         else r = m;
24     }
25     int p = l;
26     if ( a[l] > a[r] ) p = r;
27     return r;
28 }
29
30 bool find(int *a, int s, int arrlen){
31     if( !a ) return false;
32     int l = 0;
33     int r = arrlen-1;
34     int m = findBound(a, r);
35     cout << "start pos: " <<  m << endl;
36     if( s >= a[m] && s <= a[r] ) {
37         l = m;
38     } else {
39         r = m-1;
40     }
41     cout << "searching set [" << l << ","<< r << "]" << endl;
42     while ( l <= r ){
43         m = (l+r)>>1;
44         if( a[m] == s) return true;
45         if( a[m] > s ) r = m-1;
46         else l = m + 1;
47     }
48     return false;
49 }
50
51 int main(){
52     int a[] = {1,1,1,1,0,1,1};
53     if(find(a, 1, 7)) {
54         cout << "find" << endl;
55     } else {
56         cout << "not found" << endl;
57     }
58 }

转载于:https://www.cnblogs.com/25-to-life/p/4496414.html

循环数组中找查找某个数值相关推荐

  1. html5数组查找第二大数,2021-06-29:在两个都有序的数组中找整体第K小的数。

    2021-06-29:在两个都有序的数组中找整体第K小的数. 福大大 答案2021-06-29: 1.A和B长度不等的时候,需要把A和B的长度变成相等. A是短数组,B是长数组. 第k小的数,k从1开 ...

  2. 在两个有序的数组中找第N个数,二分查找 O(lgm+lgn)级

    在两个有序的数组中找第N个数,O(lgm+lgn)级 分类: 算法2009-10-09 20:52 981人阅读 评论(3) 收藏 举报 问题描述: Give a divide and conquer ...

  3. python查找数列中重复数字_在数组中找出重复的数字(异或法)

    购买本课程后,可以加51CTO学院李宁老师官方交流群:550369460注意,该群只允许购买李宁老师课程的学员进行技术交流,加群时需要提供在51CTO购买李宁老师课程的订单编号(任何一个课程的订单编号 ...

  4. (python)给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的两个整数。

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的 两个 整数. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nu ...

  5. 从一个数组中找出 N 个数,其和为 M 的所有可能--最 nice 的解法

    比起讨论已经存在的大牛,我们更希望有更多有潜力的前端小伙伴成为大牛,只有这样,前端在未来才能够持续不断的发光发热. 故事的背景 这是一个呆萌炫酷吊炸天的前端算法题,曾经乃至现在也是叱咤风云在各个面试场 ...

  6. 【算法】快速选择算法 ( 数组中找第 K 大元素 )

    算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...

  7. 算法题001 剑指Offer 面试题三:二维数组中的查找

    剑指Offer题目1:二维数组中的查找 题目描述: http://ac.jobdu.com/problem.php?cid=1039&pid=0 在一个二维数组中,每一行都按照从左到右递增的顺 ...

  8. 《剑指Offer》——二维数组中的查找(JZ1)C++

    文章目录 前言 题目:JZ1 二维数组中的查找 一.暴力解法 二.优化解法 总结 前言 题目:JZ1 二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序, ...

  9. 剑指offer刷题(java)|二维数组中的查找|替换空格|leetcode刷题

    文章目录 前言 一.二维数组中的查找 题目 题解一 题解二 题解三 二.替换空格 题目 题解一 题解二 题解三 前言 本文主要是写了我做算法题的思路以及对其他优秀题解的自我理解. 一.二维数组中的查找 ...

最新文章

  1. 使用 alpine 打包镜像注意事项
  2. linux使用vim浏览python源码
  3. queued frame 造成图形性能卡顿
  4. Javascript模板引擎handlebars使用实例及技巧
  5. 使用Arcgis进行画面(线)并计算大小(长度)。
  6. horizon服务主要模块_Horizon Workspace 快速部署指南三(配置Workspace数据模块)
  7. 对比损失的PyTorch实现详解
  8. 钱准备好!苹果官方账号泄密:iPhone 12明晚发布有戏
  9. 另一个角度看Java常量池
  10. python接口自动化(三十三)-python自动发邮件总结及实例说明番外篇——下
  11. 图像语义分割(13)-OCNet: 用于场景解析的目标语义网络
  12. ACM算法笔记(一)模拟算法【详细解析】
  13. ajax submittype,AjaxSubmit()提交file文件
  14. 有限元微分方程求解方法,能量原理,瑞利里兹法,伽辽金法(曾攀有限元分析)
  15. 数据库升级造成的X_$BH状态异常问题
  16. 最新全国行政区划,省市区县乡镇四级json数据
  17. tabLayout 设置分割线
  18. sat数学可以用计算机吗,SAT数学考试带计算机是否可以
  19. .\Obj\Template.axf: error: L6002U: Could not open file .\obj\core_cm3.o: No such file or directory
  20. Halcon形态学梯度

热门文章

  1. SqlServer之OutPut
  2. LeetCode(961)——重复 N 次的元素(JavaScript)
  3. LeetCode(461)——汉明距离(JavaScript)
  4. retrofitWrap
  5. hbase占用内存过高_内存占用率过高怎么办?Win10电脑内存占用率很高原因和解决方法...
  6. 面向切面编程:操作日志
  7. 输入5个整数,找出5个数中的两位数
  8. 有时我都非常讨厌自己,特别容易相信人
  9. 买了社保,再买农村医保是不是多余?
  10. 现在为什么不出翻盖手机了?