加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 模式 > 正文

「手撕算法」锁定大厂看这就可

发布时间:2020-09-17 20:29:16 所属栏目:模式 来源:我是程序员小贱
导读:基础数据结构的融合是成为庞大系统的基石。比如Redis中的跳跃表,数据库索引B+树等,只有对基础的数据结构足够的熟悉才能更容易去理解稍微复杂的结构,就仿佛我们闯关打怪一样,一步一步解锁直到结局。今天想和大家一起分享的是常见数据结构以及面试中的高

这里主要是看看原始数组有重复数的情况。

「手撕算法」锁定大厂看这就可

二分

1 查找第一个值等于给定值的情况(查找元素7)

·

首先7与中间值a[4]比较,发现小于7,于是在5到9中继续查找,中间a[7]=7,但是这个数7不是第一次出现的。那么我们检查这个值的前面是不是等于7,如果等于7,说明目前这个值不是第一次出现的7,此时更新rihgt=mid-1。ok我们看看代码

int BinarySerach(vector& nums, int n,int target) {     int left = 0, right = n-1;     while (left <= right) {         int mid = left+((right-left)>>1);         if (nums[mid]>value)         {             right=mid-1;         } else if(nums[mid]<value)         {             left=mid+1;         }else         {             if((mid==0)||(nums[mid-1]!=value))             {                 return mid;             }else             {                 left=mid-1;             }         }     return -1; } 

2 查找最后一个值等于给定值的情况

假设nums[mid]这个值已经是最后一个元素了,那么它肯定是要找到最后一个值。如果nums[mid]的下一个不等于value,那说明nums[mid]就是我们需要找到最后一个等于给定值的值。

int BinarySerach(vector& nums, int n,int target) {     int left = 0, right = n-1;     while (left <= right) {         int mid = left+((right-left)>>1);         if (nums[mid]>value)         {             right=mid-1;         } else if(nums[mid]<value)         {             left=mid+1;         }else         {             if((mid==n-1)||(nums[mid+1]!=value))             {                 return mid;             }else             {                 left=mid+1;             }         }     return -1; } 

3 查找第一个大于等于给定值的情况

如果nums[mid]小于要查找的值,那么我们需要查找在[mid+1,right]之间,所以此时更新为left=mid+1 如果nums[mid]大于给定值value,这个时候需要查看nums[mid]是不是我们需要找的第一个值大于等于给定值元素,如果nums[mid]前面没有元素或者前面一个元素小于查找的值,那么nums[mid]就是我们需要查找的值。相反 如果nums[mid-1]也是大于等于查找的值,那么说明查找的元素在[left,mid-1]之间,所以我们需要将right更新为mid-1 int BinarySerach(vector& nums, int n,int target) {     int left = 0, right = n-1;     while (left <= right) {         int mid = left+((right-left)>>1);         if (nums[mid]>value)         {             right=mid-1;         } else if(nums[mid]<value)         {             left=mid+1;         }else         {             if((mid==n-1)||(nums[mid+1]!=value))             {                 return mid;             }else             {                 left=mid+1;             }         }     return -1; } 

4 查找第一个大于等于给定值的情况

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读