NYOJ 776 删除元素(二分查找)

举报
Linux猿 发表于 2021/08/04 23:36:55 2021/08/04
【摘要】 题目链接~~> 做题感悟: 做了这题后觉悟了很多,才认识到二分的强大,以前只是对二分有点了解,今天才真正明白二分。首先是如果你没读懂题意,做再多遍也是 WA 。其次是当你做一个题一直 WA 时你就应该考虑一下是否没读懂题意,是否该用 long long 的没用 long long 等。不要不管三七二十一狂提交! 二分查找(以下情况为查找左闭右开区间):复杂...

题目链接~~>

做题感悟: 做了这题后觉悟了很多,才认识到二分的强大,以前只是对二分有点了解,今天才真正明白二分害羞。首先是如果你没读懂题意,做再多遍也是 WA 。其次是当你做一个题一直 WA 时你就应该考虑一下是否没读懂题意,是否该用 long long 的没用 long long 等。不要不管三七二十一狂提交!

二分查找(以下情况为查找左闭右开区间):复杂度 log(n)

              (1)、单纯查找一个数是否在一个序列里。

代码:


  
  1. int binary(int x,int y,int v)// 查找左闭右开区间
  2. {
  3. int m ;
  4. while(x<y) // 这里要和上面保持一致
  5. {
  6. m=x+(y-x)/2 ;
  7. if(g[m]==v) return m ;
  8. else if(g[m]>v) y=m ;
  9. else x=m+1 ;
  10. }
  11. return -1 ;
  12. }

            (2)、二分查找求下界。返回的时候返回的是大于等于要查找的值的下标!

代码:


  
  1. int lower_bound(int x,int y,int v)
  2. {
  3. int m ;
  4. while(x<y)
  5. {
  6. m=x+(y-x)/2 ;
  7. if(g[m]>=v) y=m ;
  8. else x=m+1 ;
  9. }
  10. return x ;
  11. }

             (3)、二分查找求上界。返回的时候返回的是大于要查找的值的下标(如果要查找的值是最大值返回数组个数)。

            (4)、求下界只需要把   if ( g[m] >= v)  y=m ;   else   x=m+1 ; 改为if ( g[m] <= v)  x=m+1 ;  else   y=m+1 ;

            (5)、用函数求上界和下界。头文件:#include<algorithm>+using namespace std ;

            求下界函数:lower_bound(数组名,数组名+数组元素个数,要查找的数)-数组名(因为返回的是地址) ;

            求上界函数:upper_bound(数组名,数组名+数组元素个数,要查找的数)-数组名(同上) ;

本题代码:


  
  1. #include<stdio.h>
  2. #include<algorithm>
  3. using namespace std ;
  4. int n ;
  5. int g[100005] ;
  6. int binary(int x,int y,int v) // 二分查找求上界
  7. {
  8. int m ;
  9. while(x<y)
  10. {
  11. m=x+(y-x)/2 ;
  12. if(g[m]<=v) x=m+1 ;
  13. else y=m ;
  14. }
  15. return n-x ;
  16. }
  17. int main()
  18. {
  19. int i ;
  20. while(scanf("%d",&n)!=EOF)
  21. {
  22. for(i=0 ;i<n ;i++)
  23. scanf("%d",&g[i]) ;
  24. sort(g,g+n) ;
  25. int ans=1999999999,num ;
  26. for(i=0 ;i<n ;i++)
  27. {
  28. num=binary(0,n,g[i]*2)+i ;
  29. ans= ans < num ? ans : num ;
  30. }
  31. printf("%d\n",ans) ;
  32. }
  33. return 0 ;
  34. }

关于二分的博客~~>
 

文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/14554441

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。