Leetcode Find Minimum in Rotated Sorted Array 题解

举报
xindoo 发表于 2022/04/16 00:23:24 2022/04/16
【摘要】 Leetcode Find Minimum in Rotated Sorted Array 题目大意:      对一个有序数组翻转, 就是随机取前K个数,移动到数组的后面,然后让你找出最小的那个数,注意,K有可能是0,也就是没有翻转。      毫无疑问,遍历一次...

Leetcode Find Minimum in Rotated Sorted Array

题目大意:

     对一个有序数组翻转, 就是随机取前K个数,移动到数组的后面,然后让你找出最小的那个数,注意,K有可能是0,也就是没有翻转。


     毫无疑问,遍历一次肯定可以找到,但这样时间复杂度是O(n),如果你在面试的时候遇到这样的问题,你这样回答面试官肯定不会满意的,我们接下来讨论有没有什么更快的方法。O(nlogn)??

我还是把O(N)的代码贴出来,不知道为什么leetcode上居然不超时。


  
  1. //O(n)
  2. class Solution {
  3. public:
  4. int findMin(vector<int> &num) {
  5. int minval = 0x3f3f3f3f;
  6. int len = num.size();
  7. for (int i = 0; i < len; i++) {
  8. minval = min(minval, num[i]);
  9. }
  10. return minval;
  11. }
  12. };

       我本人写了两次代码,第一份很不尽人意,首先对没有翻转的情况做了特判,然后一直遇到二分边界的问题,只要二分两个数的时候就会死循环,索性就加了特判,两个数的时候直接输出最小的一个,代码冗长混乱,思路也不严谨,先贴出来做个反例。


  
  1. //O(nlogn) bad
  2. class Solution {
  3. public:
  4. int findMin(vector<int> &num) {
  5. int len = num.size();
  6. if (num[0] <= num[len-1])
  7. return num[0];
  8. int l = 0, r = len-1;
  9. while (l < r) {
  10. int mid = (l+r)>>1;
  11. if (num[mid] > num[l]) {
  12. if (num[mid] > num[0])
  13. l = mid+1;
  14. if (num[mid] < num[len-1])
  15. r = mid;
  16. }
  17. else if (num[mid] < num[r])
  18. r = mid;
  19. else
  20. return min(num[l], num[r]);
  21. }
  22. return num[l];
  23. }
  24. };


  
  1. //O(nlogn) good
  2. class Solution {
  3. public:
  4. int findMin(vector<int> &num) {
  5. int len = num.size();
  6. int l = 0, r = len-1;
  7. while (l < r) {
  8. int mid = (l+r)>>1;
  9. if (num[mid] > num[r])
  10. l = mid+1;
  11. else
  12. r = mid;
  13. }
  14. return num[l];
  15. }
  16. };


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

原文链接:xindoo.blog.csdn.net/article/details/40370675

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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