关注上方程序员小熊,回复算法、python、cpp、C++、512和1024,即可获取海量学习资料!
前言
大家好,我是熊哥。最近一位朋友去面试了字节跳动的后台开发的岗位,其一面的算法题,个人感觉比较简单。
分享一下,供大家参考,大家看看难不难,希望能对大家学习和找工作有所帮助。
查找最大值
有一个整型数组,数组元素不重复,数组元素先升序后降序,例如:1,3,5,7,9,8,6,4,2,请写一个函数找出数组最大的元素。
解题思路
咋一看本题,大家都会觉得很简单。很容易想到如下两种思路:
思路一:对数组按照从大到小或从小到大进行排序,那么第一个元素或最后一个元素就是最大的元素。
思路二:遍历整个数组,设置最大元素为第一个元素,边遍历边比较,同时更新最大元素。
尽管上述两种方法都可以,前者如果用快排的时间复杂度为O(nlgn),后者时间复杂度为O(n),其中 n 是数组的长度,但这样做,面试官可能就会让你回去等答复。
二分查找
本题可以采用二分法去做。原因:数组一端升序另一端降序。只要找到升序一端的最后一个元素即可。
示例
以 nums = {7, 8, 6, 5, 4}为例,如下图示:
由于数组是先升后降,所以第一个元素或最后一个元素不可能是最大元素,查找区间可设定为[1, numsSize - 2]。
比较中间元素与其下一个元素大小关系,缩小目标值的查找区间。
获取升序的一端的最后一个元素(目标值)。
注意
由于题目已提示数组元素不重复,因此不需要考虑有相同元素的情况。
Show me the Code
C
intgetLargestNumInArray(int*nums,intnumsSize){if(nums==NULL||numsSize<=0){return-1;}intleft=1,right=numsSize-2;while(left<=right){intmid=left+((right-left)>>1);if(nums[mid]<nums[mid+1]){left=mid+1;}else{right=mid-1;}}returnnums[left];}
复杂度分析
时间复杂度:O(lgn),其中 n 为数组的长度;
空间复杂度:O(1),未开辟额外存储空间。
往期精彩回顾
快手最新面试真题
阿里云最新面试真题
阿里菜鸟网络一面最新笔试题
vivo 服务器开发工程师面试题
决定你是否能进字节的几道题
微信信用卡还款后台开发最新面试真题
更多精彩
关注公众号程序员小熊
点“赞”和“在看”哦
如果觉得《字节跳动最新简单算法面试题》对你有帮助,请点赞、收藏,并留下你的观点哦!