
前言: 刷题和面试兼顾还得看你啊-牛客网
近几年互联网受疫情影响,许多互联网都使用牛客网在线笔试招人
很多同学因为不熟悉牛客网的环境和使用,最后在线笔试面试中屡屡受挫
牛客网提供了语言巩固,算法提高等在线OJ题,更有面试真题,大厂内推!
链接附上点击链接注册牛客网
牛客网这么好用,但是下面几个关于牛客网的知识你了解过吗?
目录

题目描述:在一个数组中找某个目标值,找到返回下标,找不到返回-1(题目简单)
- int search(int* nums, int numsLen, int target ) {
- int left=0;
- int right=numsLen-1;
- while(left<=right)
- {
- int mid=(left+right)/2;
- if(nums[mid]>target)
- {
- right=mid-1;
- }
- else if(nums[mid]
- {
- left=mid+1;
- }
- else
- {
- return mid;
- }
- }
- return -1;
- }

我思考的两个问题:
- while(left<=right)终止条件是left>right,在left==right相遇点的值可能是target
- a[mid]>或
变式1:
题目给定无重复元素,但如果题目考虑数组中的目标值存在且可以重复且要你返回第一个目标值,那你该怎么做?
2.二维数组中的查找

题目描述:
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数

- bool Find(int target, int** array, int arrayRowLen, int* arrayColLen ) {
- // write code here
- int x=0;
- int y=*arrayColLen-1;
- while(x<=arrayRowLen-1&&y>=0)
- {
- if(array[x][y]>target)
- {
- y--;
- }
- else if(array[x][y]
- {
- x++;
- }
- else
- {
- return true;
- }
- }
- return false;
- }
关于我思考的两个问题:
- 查找一定程度上是排除法,一次能排除能几个有时候决定了时间复杂度
- 代码书写中while里是循环退出的条件,while里的if是对根据情况做出的调整。
3.寻找峰值

题目描述:
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可,请使用O(logN)的时间复杂度实现此问题吗?

题解:a[mid]和a[mid+1]比较:
在这里我想说a[mid+1]在后面为什么也不会越界,因为mid即使是在只有两个元素的时候,mid也是==left,而在只有一个元素的时候,就是已经退出while,已经找到了峰值元素。
- int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {
- // write code here
- int left=0;
- int right=rotateArrayLen-1;
- while(left
- {
- if(rotateArray[left]
- {
- return rotateArray[left];
- }
- int mid=left+((right-left)>>1);//优先级
- if(rotateArray[mid]>rotateArray[right])
- {
- left=mid+1;
- }
- else if(rotateArray[mid]
- {
- right=mid;
- }
- else
- {
- right--;
- }
- }
- return rotateArray[left];
- }
4.旋转数组的最小数字

题目描述:
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
解题思路:本题特别说明非降序,就是说从后忘前是>=的关系,旋转后只是变成了两个非降序,那么只要找到
a[mid]和a[right]比较;
如果a[mid]>a[right],a[mid]到a[right]一定不是升序的,也就是a[mid]从升再到降到a[right],则最小值在右半边且a[mid]不在区间里,即更新为left=mid+1;
如果a[mid]
如果a[mid]==a[right],不一定!!!有可能最小值在左边,也有可能在右边,如下例子;



- int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {
- // write code here
- int left=0;
- int right=rotateArrayLen-1;
- while(left
- {
- if(rotateArray[left]
- {
- return rotateArray[left];
- }
- int mid=left+((right-left)>>1);//优先级
- if(rotateArray[mid]>rotateArray[right])
- {
- left=mid+1;
- }
- else if(rotateArray[mid]
- {
- right=mid;
- }
- else
- {
- right--;
- }
- }
- return rotateArray[left];
- }
5.总结
- 查找算法,O(logN),优先考虑二分查找
- while(left
- 缩小后的区间和原区间特征是相同的
- if判断条件最难找,也就是二分查找的关键
- if花括号里的更新得看mid是否可以排除在新区间外

还是得多画图啊!
最后:这波虽然只有4道关于二分查找的题,是不是不过瘾呐?点击链接做牛客网算法题
-
相关阅读:
前后端分离项目(十):实现"改"功能(前后端)
C++重载运算符
李峋同款会动的爱心Python代码版
[论文阅读] 颜色迁移-Automated Colour Grading
低延时实时音视频在5G远程操控场景的应用实践
新库上线 | CnOpenData中国星级酒店数据
【计算机视觉项目实战】中文场景识别
80%的前端开发都答不上来的js异步面试题
花菁染料CY5标记WSe2硒化钨/WTe2碲化钨纳米粒|CY5-WSe2/WTe2(齐岳荧光标记)
css实现炫酷的圆环相交转动动画
-
原文地址:https://blog.csdn.net/qq_64428099/article/details/125833028